Возможность установить TTL в очереди Redis с помощью Bull?

node.js #redis #ttl #bull

#node.js #redis #ttl #bull

Вопрос:

У меня есть приложение, использующее Bull для очереди. Есть ли параметр, который я могу передать, чтобы автоматически устанавливать TTL (время жизни) для каждой записи при ее создании?

 const Queue = require('bull')
const webApiQueue = new Queue('webApi', {redis: REDIS_URL })

// Producer
const webApiProducer = (data) => {
  webApiQueue.add(data, { lifo: true })
}
 

Если вы устанавливаете ключ с помощью Redis напрямую, вы можете использовать setex key_name 10000 key_data

Но как я могу реализовать это в Bull? Это просто очередь обработки API, и я хочу, чтобы она автоматически удаляла записи через 24 часа.

Я ничего не вижу в документации: https://github.com/OptimalBits/bull#documentation

Комментарии:

1. У меня такой же вопрос. Моему ElastiCache не хватает памяти и выдает ошибку, -OOM command not allowed when used memory > 'maxmemory'. какое решение вы нашли?

Ответ №1:

Из того, что я понял, похоже, что явная установка TTL (например, 24 часа) для клавиш Redis не является рекомендуемым способом решения этой проблемы.

Похоже, что канонический подход заключается в том, чтобы очищать ключи только при необходимости (например, когда у нас заканчивается память).

Эта проблема указала мне правильное направление.

Если вы хотите, чтобы Bull немного больше управлял своей памятью, гм, разумно, попробуйте указать removeOnComplete и removeOnFail , как описано в документации (обратите внимание, что оба значения по умолчанию false равны ).

Совершенно другим подходом было бы решить проблему управления памятью в вашей конфигурации Redis, установив значение maxmemory-policy allkeys-lru , как описано в документах Redis.

Если вместо этого вы используете AWS ElastiCache, у Amazon есть некоторая документация по этим же методам. ElastiCache по умолчанию использует maxmemory-policy значение of volatile-lfu , что вызовет проблемы с памятью с помощью Bull, поскольку Bull не устанавливает TTL. Я бы рекомендовал изменить это на allkeys-lru .

Как бы то ни было, я предполагаю, что наиболее эффективным решением является изменение maxmemory-policy конфигурации Redis / ElastiCache. Таким образом, Redis сам управляет ключами, а не добавляет накладные расходы на удаление завершенного / неудачного задания.