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 сам управляет ключами, а не добавляет накладные расходы на удаление завершенного / неудачного задания.