AWS Lambda: Ошибка тайм-аута подключения Redis ElastiCache

0

Вопрос

У меня есть лямбда-функция, использующая узел 12.

Мне нужно добавить новое подключение к базе данных Redis, размещенной в AWS ElastiCache.

Оба находятся в одном частном VPC, и группы/подсети безопасности настроены правильно.

Решение:

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 (внешний обработчик):

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

Вызов функции:

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

Проблема: При увеличении времени ожидания лямбда до значения, превышающего время ожидания Redis, я получаю эту ошибку:

ОШИБКА КЛИЕНТА REDIS:Ошибка: подключение Redis к ... не удалось - время ожидания подключения ...

Дополнение:

Я пробовал выходить/закрывать соединение после каждой транзакции:

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

Ошибка:

REDIS GET: AbortError: GET не может быть обработан. Соединение уже закрыто.

Дополнительные Примечания:

  • Я должен использовать обратные вызовы, вот почему я передаю их в приведенных выше примерах
  • Я использую "redis": "^3.0.2"
  • Это не проблема конфигурации, так как к кэшу обращались сотни раз за небольшой промежуток времени, но затем он начал выдавать ошибки тайм-аута.
  • Все работает нормально локально
1

Лучший ответ

2

Это не проблема конфигурации, так как к кэшу обращались сотни раз за небольшой промежуток времени, но затем он начал выдавать ошибки тайм-аута.

я думаю, что это источник проблемы, вероятно, размер базы данных redis превысил предельный размер, и он не может обрабатывать новые данные?

Можете ли вы удалить в нем старые данные?

Также возможно, что эластичный кэш имеет ограничения на подключения новых TCP-клиентов, и если он исчерпан, новые подключения будут отклонены с аналогичным сообщением об ошибке, о котором вы упомянули.

Если клиент redis в функции aws lambda не может установить соединение, функция aws lambda завершается сбоем - и запускается новая. Новая лямбда-функция устанавливает еще одно соединение с redis, redis не может его обработать, и запускается еще одна лямбда-функция...

Итак, в какой-то момент мы достигли предела активных подключений redis, и система зашла в тупик.

Я думаю, что вы можете временно остановить все лямбда-функции и масштабировать базу данных redis с эластичным кэшем.

2021-11-23 20:45:33

Отдельные узлы ElastiCache для Redis поддерживают до 65 000 одновременных клиентских подключений. Есть идеи о какой-нибудь полезной конфигурации/показателях, которые я могу проверить на наличие других возможных причин?
Majed Badawi

На других языках

Эта страница на других языках

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