AWS Lambda: Redis ElastiCache errore di timeout di connessione

0

Domanda

Ho una funzione lambda utilizzando il Nodo 12.

Ho bisogno di aggiungere una nuova connessione a un Redis database su AWS ElastiCache.

Entrambi sono in una privata VPC e i gruppi di protezione/subnet sono configurati correttamente.

Soluzione:

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 (al di fuori del gestore):

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

Chiamata di funzione:

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

Problema: Quando aumenta la lambda timeout per un valore maggiore di Redis timeout, ottengo questo errore:

REDIS CLIENT di ERRORE:Errore: Redis connessione ... non è riuscita - la connessione ETIMEDOUT ...

Aggiunta:

Ho cercato di cessare/chiudere la connessione dopo ogni transazione:

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

Errore:

REDIS OTTENERE: AbortError: OTTENERE non può essere elaborata. La connessione è già chiuso.

Note Extra:

  • Devo usare il callback, questo è il motivo per cui io passo a quelli negli esempi di cui sopra
  • Sto utilizzando "redis": "^3.0.2"
  • Non è un problema di configurazione, come la cache è stata letta centinaia di volte in un breve periodo di tempo, ma poi ha iniziato a dare gli errori di timeout.
  • Tutto funziona normalmente locale
1

Migliore risposta

2

Non è un problema di configurazione, come la cache è stata letta centinaia di volte in un breve periodo di tempo, ma poi ha iniziato a dare gli errori di timeout.

penso che sia l'origine del problema, probabilmente redis dimensione del database ha colpito il limite di dimensione, ed è in grado di elaborare i nuovi dati?

È possibile eliminare i vecchi dati in esso?

Inoltre è possibile Elastico Cache ha dei limiti sul nuovo TCP clienti connessioni, e se la sua impoverito, le nuove connessioni sono rifiutato con un messaggio di errore simile che hai menzionato.

Se redis client in aws funzione lambda non riesce a stabilire la connessione, aws funzione lambda non riesce - e di nuovo è iniziato. Nuova funzione lambda fa più a redis, redis in grado di elaborare, e ancora una funzione lambda è iniziato...

Così, in un momento, abbiamo raggiunto il limite attivo redis connessioni, e il sistema è in stallo.

Penso che si può temporanea interrompere tutte le funzioni lambda, e la scala fino Elastico Cache redis database.

2021-11-23 20:45:33

Singoli ElastiCache per Redis nodi di supportare fino a 65.000 simultaneo di connessioni client. Qualche idea su qualche configurazione utili/metriche posso controllare per altre possibili cause?
Majed Badawi

In altre lingue

Questa pagina è in altre lingue

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