AWS Lambda: Redis ElastiCache erreur de délai de connexion

0

La question

J'ai une fonction lambda l'aide d'un Noeud de 12.

J'ai besoin d'ajouter une nouvelle connexion à une Redis base de données hébergée dans AWS ElastiCache.

Les deux sont dans un privé VPC et de la sécurité des groupes/sous-réseaux sont configurés correctement.

Solution:

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 (en dehors de gestionnaire):

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

Appel de la fonction:

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

Problème: Lors de l'augmentation de lambda délai d'attente pour une valeur supérieure à Redis délai d'attente, je reçois cette erreur:

REDIS CLIENT d'ERREUR:Erreur: le Redis connexion à échoué ... - se connecter ETIMEDOUT ...

Plus:

J'ai essayé de quitter/fermer la connexion après chaque opération:

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

Erreur:

REDIS OBTENIR: AbortError: OBTENIR ne peut pas être traitée. La connexion est déjà fermé.

Notes Supplémentaires:

  • J'ai utiliser des rappels, c'est pourquoi je passe dans les exemples ci-dessus
  • Je suis à l'aide d' "redis": "^3.0.2"
  • Ce n'est pas un problème de configuration que le cache a été consulté centaine de fois dans un court laps de temps, mais il a ensuite commencé à donner les erreurs de délai d'attente.
  • Tout fonctionne normalement localement
1

La meilleure réponse

2

Ce n'est pas un problème de configuration que le cache a été consulté centaine de fois dans un court laps de temps, mais il a ensuite commencé à donner les erreurs de délai d'attente.

je pense que c'est l'origine du problème, probablement redis taille de base de données frappé la limite de taille, et il ne peut pas traiter de nouvelles données?

Pouvez-vous supprimer les anciennes données qu'il contient?

Il est également possible Élastique Cache a des limites sur les nouveaux clients TCP connexions, et si son appauvri, les nouvelles connexions sont refusé avec le message d'erreur similaire que vous avez mentionné.

Si redis client aws lambda fonction ne peut pas établir de connexion, aws lambda fonction échoue - et un nouveau commence. Nouvelle fonction lambda fait plus de connexion redis et redis ne peut pas la traiter, et encore une fonction lambda est commencé...

Donc, à un moment, nous avons atteint la limite sur l'actif redis connexions, et que le système est dans l'impasse.

Je pense que vous pouvez suspendre temporairement toutes les fonctions lambda, et à l'échelle, Élastique Cache redis.

2021-11-23 20:45:33

Personne ElastiCache pour Redis nœuds en charge jusqu'à 65 000 connexions simultanées de clients. Une idée utile de configuration/paramètres je peux vérifier pour d'autres causes possibles?
Majed Badawi

Dans d'autres langues

Cette page est dans d'autres langues

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