A AWS Lambda: Redis ElastiCache de erro de tempo limite de conexão

0

Pergunta

Eu tenho uma função lambda usando o Nó 12.

Eu preciso adicionar uma nova conexão para um Redis banco de dados hospedado no AWS ElastiCache.

Ambos estão na privada de um VPC e os grupos de segurança/sub-redes estão configuradas corretamente.

Solução:

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 (fora da rotina de tratamento):

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

Chamada da função:

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

Problema: Quando o aumento do lambda de tempo limite para um valor maior do que o Redis tempo de espera, recebo este erro:

REDIS CLIENTE de ERRO:Erro: Redis conexão para ... falha - ligar ETIMEDOUT ...

Adição:

Eu tentei quiting/fechar a conexão após cada transação:

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

Erro:

REDIS OBTER: AbortError: GET pode não ser processadas. A conexão já está fechado.

Notas Extras:

  • Eu tenho para utilizar chamadas de retorno, é por isso que eu passar uns nos exemplos acima
  • Eu estou usando "redis": "^3.0.2"
  • Não é um problema de configuração como o cache foi acessado mais de uma centena de vezes em um pequeno período de tempo, mas, em seguida, começou a dar os erros de tempo limite.
  • Tudo funciona normalmente localmente
1

Melhor resposta

2

Não é um problema de configuração como o cache foi acessado mais de uma centena de vezes em um pequeno período de tempo, mas, em seguida, começou a dar os erros de tempo limite.

eu acho que é a origem do problema, provavelmente redis tamanho do banco de dados atingiu o limite de tamanho, e ele não pode processar novos dados?

Você pode apagar os dados antigos-lo?

Também é possível Elástico Cache tem limites para novos clientes TCP conexões, e se a sua esgotado, novas conexões são recusadas com mensagem de erro semelhante que você mencionou.

Se redis cliente da aws função lambda não é possível estabelecer a conexão, o aws função lambda falha - e uma nova é iniciada. Nova função lambda faz uma conexão mais para redis, redis não é possível processá-lo, e mais uma função lambda é iniciado...

Assim, em um determinado momento, atingimos o limite de ativo redis conexões, e o sistema está em um impasse.

Eu acho que você pode temporária de parar todas as funções lambda, e escala de Elástico Cache redis banco de dados.

2021-11-23 20:45:33

Individual ElastiCache para Redis nós até 65.000 clientes em simultâneo. Alguma idéia sobre úteis para a configuração/métricas que eu possa verificar outras possíveis causas?
Majed Badawi

Em outros idiomas

Esta página está em outros idiomas

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