Celery/Redis task expiration

Я использую Celery с супервизором, управляющим работниками, и Redis в качестве посредника, и у меня возникла проблема с зависанием работника Celery, который не может обрабатывать больше задач и приводит к тому, что очередь его задач в Redis заполняется до точка вызывает некоторые проблемы с памятью. Я пытался установить expires вариант, когда я вызвал задачу, думая, что это будет использовать поддержку Redis для истечения срока действия ключа:

some_task.apply_async(args=('foo',), expires=60)

но это не сработало, и когда я проверял соответствующий список в CLI Redis, он просто продолжал расширяться - возможно, это неудивительно, потому что кажется, что истечение срока действия списка не является встроенной функциональностью в Redis. Документы Celery говорят, что время истечения соответствует времени после "публикации" задачи, но я не смог найти упоминания о том, что на самом деле означает "публикация". Я предполагал, что это относится к добавлению задачи в список Redis, так что либо это предположение неверно, либо происходит что-то еще, что я не понимаю (или оба).

Я ошибаюсь по поводу срока действия задания? И если так, есть ли способ заставить сообщения истечь в Redis?

1 ответ

Контекст более загадочный, чем вопрос. Вы можете использовать Redis-Cli, и вы проверили ключи Redis. В Redis-Cli, вы можете ввести ttl sexykey и вы должны были увидеть оставшиеся секунды или нет, если ключ был установлен на срок действия, когда он был написан там Celery, и, таким образом, ответить на эту конкретную неопределенность с вашей стороны в этом вопросе.

Во-первых, давайте проясним, что есть message broker, Во-вторых, есть result backend, У сельдерея только очень мало message brokers но многие result backends, Список брокеров находится здесь. Список поддерживаемых бэкэндов находится на странице 10 (с 2018 по 24 марта) в разделе Транспорт и бэкэнды здесь. Это result backend что, я полагаю, заполняется, потому что это то, что я тоже вижу.

Сельдерей может использовать один и тот же экземпляр Redis как message broker и result backend, Celery хранит в качестве ключа Redis результат выполненной задачи, независимо от того, была ли эта задача выполнена успешно или нет, и этот ключ Redis имеет срок действия по умолчанию 1 день (86400 секунд). Таким образом, если у вас есть много вызовов функций, выполняемых Celery, то ваш кэш Redis в памяти будет заполнен, потому что истечение срока действия ключа 86400 секунд не догонит входящую запись результатов задач.

Чтобы сократить срок действия ключа до 60 секунд, вот фрагмент кода Python:

app = Celery('justdoit',
    broker='redis://172.17.0.2',
    backend='redis://172.17.0.2')

app.conf.result_expires = 60

PS: я только что изучал Celery несколько часов назад, и я сразу же узнал (до того, как это произойдет) тот самый сценарий заполнения Redis, как описано. Я использую Redis в течение года, поэтому я знаю некоторые его характеристики.

Другие вопросы по тегам