Проблема при попытке получить размер очереди Celery с помощью redis-cli (для приложения Django)

Я использую Django==2.2.24 и celery[redis]==4.4.7.

Я хочу получить длину очередей celery, чтобы использовать эту информацию для целей автомасштабирования в AWS EC2.

Я нашел следующий фрагмент документации:

https://docs.celeryproject.org/en/v4.4.7/userguide/monitoring.html#redis


Redis

Если вы используете Redis в качестве брокера, вы можете наблюдать за Celery кластера с помощью команды redis-cli для получения списка длин очередей. Осмотр очередей

Определение количества задач в очереди:

$ redis-cli -h HOST -p PORT -n DATABASE_NUMBER llen QUEUE_NAME

Очередь по умолчанию называется celery. Чтобы получить все доступные очереди, invoke:

$ redis-cli -h HOST -p PORT -n DATABASE_NUMBER keys \*

Note

.

Ключи очереди существуют только тогда, когда в них есть задания, поэтому если ключ не существует, это просто означает, что в этой очереди нет сообщений. Это происходит потому, что в Redis список без элементов автоматически удаляется, и, следовательно, он не будет отображаться в команде keys и llen для этого списка возвращает 0. Кроме того, если вы используете Redis для других целей, вывод команды keys будет включать в себя несвязанные значения, хранящиеся в базе данных. Рекомендуемый способ обойти это использовать специальный номер DATABASE_NUMBER для Celery, вы также можете использовать номера баз данных для отделения приложений Celery друг от друга (виртуальные хосты), но это не повлияет на события мониторинга, используемые например, Flower, поскольку команды Redis pub/sub являются глобальными, а не основаны на базе данных.


Теперь, моя конфигурация Celery (в Django) имеет следующую соответствующую часть:

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('email', Exchange('email'), routing_key='email'),
    Queue('haystack', Exchange('haystack'), routing_key='haystack'),
    Queue('thumbnails', Exchange('thumbnails'), routing_key='thumbnails'),
)

Так что я попробовал следующее:

$ redis-cli -n 0 -h ${MY_REDIS_HOST} -p 6379 llen haystack

(да, celery настроен на использование базы данных redis номер 0)

Я пробовал свои 4 очереди, и всегда получаю 0, когда это просто невозможно. Некоторые из этих очередей обычно очень активны, иначе мой сайт не работал бы должным образом.

Одной из ключевых частей документации является то, что я могу перечислить доступные очереди, поэтому я попробовал это:

$ redis-cli -n 0 -h ${MY_REDIS_HOST} -p 6379 keys \*

И я получаю около 20 000 строк примерно такого содержания:

celery-task-meta-b30fb605-d7b6-48db-b8cd-493458566876
celery-task-meta-e10ec56c-6601-420b-9f87-de6455968e76
celery-task-meta-14558a3a-1153-4f02-91f8-614bc29f6775
celery-task-meta-4c266854-512b-48af-8356-c786c507eb9e
celery-task-meta-e4ad4298-3d74-4986-8831-4c4d3c3e79f2
celery-task-meta-dfab0202-3975-46ce-9670-0d4cf3e278db
celery-task-meta-494fcb21-5995-495d-8980-0d8aa7edf0b8
celery-task-meta-345c4857-87f9-4e3f-8028-a6ef8cf93f5d
celery-task-meta-a4a48d00-68dc-4d30-87dd-869d2a20c347
celery-task-meta-d14fc394-6415-442b-8a5d-c9a4f37a9509

Если я исключу все celery-task-meta строки:

$ redis-cli -n 0 -h ${MY_REDIS_HOST} -p 6379 keys \* | grep -v celery-task-meta

Я получаю следующее:

_kombu.binding.celeryev
_kombu.binding.default
_kombu.binding.thumbnails
_kombu.binding.email
unacked
_kombu.binding.celery.pidbox
_kombu.binding.haystack
unacked_index
_kombu.binding.reply.celery.pidbox

Я попытался использовать celery CLI для получения информации, и вот некоторые соответствующие результаты:

$ celery --app my-app inspect active_queues

-> celery@683a8e8bc84f: OK
    * {'name': 'thumbnails', 'exchange': {'name': 'thumbnails', 'type': 'direct', 'arguments': None, 'durable': True, 'passive': False, 'auto_delete': False, 'delivery_mode': None, 'no_declare': False}, 'routing_key': 'thumbnails', 'queue_arguments': None, 'binding_arguments': None, 'consumer_arguments': None, 'durable': True, 'exclusive': False, 'auto_delete': False, 'no_ack': False, 'alias': None, 'bindings': [], 'no_declare': None, 'expires': None, 'message_ttl': None, 'max_length': None, 'max_length_bytes': None, 'max_priority': None}
-> celery@bf11d4c3bd6f: OK
    * {'name': 'email', 'exchange': {'name': 'email', 'type': 'direct', 'arguments': None, 'durable': True, 'passive': False, 'auto_delete': False, 'delivery_mode': None, 'no_declare': False}, 'routing_key': 'email', 'queue_arguments': None, 'binding_arguments': None, 'consumer_arguments': None, 'durable': True, 'exclusive': False, 'auto_delete': False, 'no_ack': False, 'alias': None, 'bindings': [], 'no_declare': None, 'expires': None, 'message_ttl': None, 'max_length': None, 'max_length_bytes': None, 'max_priority': None}
-> celery@86151417b361: OK
    * {'name': 'default', 'exchange': {'name': 'default', 'type': 'direct', 'arguments': None, 'durable': True, 'passive': False, 'auto_delete': False, 'delivery_mode': None, 'no_declare': False}, 'routing_key': 'default', 'queue_arguments': None, 'binding_arguments': None, 'consumer_arguments': None, 'durable': True, 'exclusive': False, 'auto_delete': False, 'no_ack': False, 'alias': None, 'bindings': [], 'no_declare': None, 'expires': None, 'message_ttl': None, 'max_length': None, 'max_length_bytes': None, 'max_priority': None}
-> celery@9a5360a82f14: OK
    * {'name': 'haystack', 'exchange': {'name': 'haystack', 'type': 'direct', 'arguments': None, 'durable': True, 'passive': False, 'auto_delete': False, 'delivery_mode': None, 'no_declare': False}, 'routing_key': 'haystack', 'queue_arguments': None, 'binding_arguments': None, 'consumer_arguments': None, 'durable': True, 'exclusive': False, 'auto_delete': False, 'no_ack': False, 'alias': None, 'bindings': [], 'no_declare': None, 'expires': None, 'message_ttl': None, 'max_length': None, 'max_length_bytes': None, 'max_priority': None}

и

$ celery --app my-app inspect scheduled

-> celery@683a8e8bc84f: OK
    - empty -
-> celery@86151417b361: OK
    - empty -
-> celery@bf11d4c3bd6f: OK
    - empty -
-> celery@9a5360a82f14: OK
    - empty -

Не так ли, если я запускаю эту команду несколько раз, идентификаторы того, что, как я предполагаю, является работниками сельдерея, каждый раз разные (часть после celery@).

Итак, кто-нибудь знает, что я могу делать неправильно и почему я не могу получить реальный размер моих очередей?

Спасибо!

Вернуться на верх