AWS Lambda: Błąd przekroczenia limitu czasu połączenia Redis ElastiCache

0

Pytanie

Mam lambda-funkcja wykorzystująca węzeł 12.

Muszę dodać nowe połączenie do bazy danych Redis, umieszczonej w AWS ElastiCache.

Oba znajdują się w jednym prywatnym VPC i grupy/podsieci bezpieczeństwa są ustawione prawidłowo.

Rozwiązanie:

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 (zewnętrzny moduł obsługi):

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);
      }
    });
  };
};

Wywołanie funkcji:

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

Problem: Zwiększenie czasu oczekiwania lambda do wartości dłuższy niż czas oczekiwania Redis, pojawia się ten błąd:

BŁĄD KLIENTA REDIS:Błąd: połączenie Redis do ... nie udało się - czas oczekiwania na połączenie ...

Dodatek:

Próbowałem wychodzić/zamykać połączenie po każdej transakcji:

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()
      });
    }
  }
})

Błąd:

REDIS GET: AbortError: GET nie może być zrealizowana. Połączenie jest już zamknięte.

Dodatkowe Uwagi:

  • Muszę użyć wywołania zwrotne, dlatego przedstawię je w powyższych przykładach
  • Używam "redis": "^3.0.2"
  • Nie jest to problem konfiguracji, tak jak do cashew zwracali się setki razy w krótkim czasie, ale potem zaczął wydawać błąd przekroczenia limitu czasu.
  • Wszystko działa normalnie lokalnie
1

Najlepsza odpowiedź

2

Nie jest to problem konfiguracji, tak jak do cashew zwracali się setki razy w krótkim czasie, ale potem zaczął wydawać błąd przekroczenia limitu czasu.

myślę, że to jest źródło problemu, chyba, rozmiar bazy danych redis przekroczył limit rozmiaru, i nie może obsługiwać nowe dane?

Czy można usunąć w nim stare dane?

Jest również możliwe, że elastyczny bufor ma ograniczeń na połączenia nowych TCP klientów, i jeśli on jest wyczerpany, nowe połączenia zostaną odrzucone z takim samym komunikatem o błędzie, o którym wspomniałeś.

Jeśli klient redis w funkcji aws lambda nie może nawiązać połączenia, funkcja aws lambda kończy się niepowodzeniem - i rozpoczyna nowy. Nowa sonda-funkcja ustawia jeszcze jedno połączenie z redis, redis nie może go przetworzyć, i uruchamia się jeszcze jedna funkcja lambda...

Tak więc, w pewnym momencie osiągnęliśmy limit aktywnych połączeń redis, a system w impasie.

Myślę, że można tymczasowo zatrzymać wszystkie funkcji lambda i powiększać bazę danych redis z elastycznym pamięci podręcznej.

2021-11-23 20:45:33

Poszczególne węzły ElastiCache dla Redis obsługują do 65 000 jednoczesnych połączeń klientów. Jakieś pomysły o jakiejś przydatnej konfiguracji/wskaźników, które mogę sprawdzić pod kątem innych możliwych przyczyn?
Majed Badawi

W innych językach

Ta strona jest w innych językach

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