AWS Lambda: Redis ElastiCache připojení timeout error

0

Otázka

Mám lambda funkce pomocí Uzlu 12.

Musím se přidat nové připojení do databáze Redis hostil v AWS ElastiCache.

Oba jsou v jedné soukromé VPC a skupin zabezpečení/podsítí jsou správně nakonfigurován.

Řešení:

globals.js:

const redis = require('redis');
const redisClient = redis.createClient(
  `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/${process.env.REDIS_DB}`,
);
redisClient.on('error', (err) => {
  console.log('REDIS CLIENT ERROR:' + err);
});
module.exports.globals = {
  REDIS: require('../helpers/redis')(redisClient),
};

index.js (mimo psovoda):

const { globals } = require('./config/globals');
global.app = globals;

const lambda_handler = (event, context, callback) => { ... }
exports.handler = lambda_handler;

helpers/redis/index.js:

const get = require('./get');
module.exports = (redisClient) => {
  return {
    get:  get(redisClient)
  };
};

helpers/redis/get.js:

module.exports = (redisClient) => {
  return (key, cb) => {
    redisClient.get(key, (err, reply) => {
      if (err) {
        cb(err);
      } else {
        cb(null, reply);
      }
    });
  };
};

Volání funkce:

app.REDIS.get(redisKey, (err, reply) => {
  console.log(`REDIS GET: ${err} ${reply}`);
});

Problém: Při zvýšení lambda timeout na hodnotu větší než Redis timeout, dostanu tuto chybu:

REDIS KLIENTA CHYBA:Chyba: Redis připojení k ... nepodařilo připojit ETIMEDOUT ...

Kromě:

Snažil jsem se zabalit/ukončení spojení, po každé transakci:

module.exports = (redisClient) => {

  return (cb) => {

    redisClient.quit((err, reply) => {
      if (err) {
        cb(err);
      } else {
        cb(null, reply);
      }
    });
  };
};
app.REDIS.get(redisKey, (err, reply) => {
  console.log(`REDIS GET: ${err} ${reply}`);
  if (err) {
    cb(err);
  } else {
    if (reply) {
      app.REDIS.quit(() => {
        cb()
      });
    }
  }
})

Chyba:

REDIS DOSTAT: AbortError: TEN nemůže být zpracován. Spojení je již uzavřen.

Další Poznámky:

  • Musím použít zpětná volání, to je důvod, proč jsem projít ty ve výše uvedených příkladech
  • Používám "redis": "^3.0.2"
  • To není problém konfigurace jako cache byla přístupná sto krát v malé časové období, ale pak začal dávat chyby vypršení časového limitu.
  • Vše funguje normálně lokálně
1

Nejlepší odpověď

2

To není problém konfigurace jako cache byla přístupná sto krát v malé časové období, ale pak začal dávat chyby vypršení časového limitu.

myslím, že to je původ problému, pravděpodobně redis databáze velikost narazí na limit velikosti, a to nemůže zpracovat nová data?

Můžete odstranit stará data?

Také je možné, Elastické Vyrovnávací paměti má limity na nové TCP klientů připojení, a pokud je jeho vyčerpané, nová spojení jsou odmítnuta s podobnými chybovou zprávu, kterou jste zmínil.

Pokud redis klienta v aws lambda funkce nelze navázat spojení, aws lambda funkce selže - a nový začal. Nové funkce lambda dělá jeden více připojení k redis redis nemůže zpracovat, a ještě jedna lambda funkce je spuštěna...

Takže v jednu chvíli, jsme narazili na limit na aktivní redis připojení a systém je v patové situaci.

Myslím, že můžete dočasně zastavit všechny lambda funkce, a rozšířit Elastické Mezipaměti redis databáze.

2021-11-23 20:45:33

Jednotlivé ElastiCache pro Redis uzly podpora až 65 000 souběžných připojení klientů. Nějaký nápad na nějaké užitečné konfigurace/metriky, můžu se podívat na jiné možné příčiny?
Majed Badawi

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................