Проблемы с сельдереем и Redis Backend - PullRequest
2 голосов
/ 08 февраля 2012

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

BROKER_BACKEND                  = "redis" 
BROKER_HOST                     = "localhost" 
BROKER_PORT                     = 6379 
BROKER_VHOST                    = "1" 
REDIS_CONNECT_RETRY     = True 
REDIS_HOST                              = "localhost" 
REDIS_PORT                              = 6379 
REDIS_DB                                = "0" 
CELERY_SEND_EVENTS                      = True 
CELERYD_LOG_LEVEL               = 'INFO' 
CELERY_RESULT_BACKEND           = "redis" 
CELERY_TASK_RESULT_EXPIRES      = 25 
CELERYD_CONCURRENCY             = 8 
CELERYD_MAX_TASKS_PER_CHILD = 10 
CELERY_ALWAYS_EAGER                     =True

Первое, что я пытаюсь сделать, это отслеживать, сколькосообщения в моей очереди.Я предполагаю, что за кулисами бэкэнд redis просто выталкивает / выталкивает из списка, хотя я не могу найти это в коде.Поэтому я создаю модель, в которой запускаю около 100 задач и пытаюсь найти их в redis: мой celeryd работает так: python manage.py celeryd -c 4 --loglevel = DEBUG -n XXXXX --logfile = logs /celery.log Таким образом, у меня должно быть только 4 одновременно работающих рабочих ..... Две вещи, которые я не понимаю: Проблема 1: После того, как я поставил в очередь 100 задач и ищу их на redis, я вижу только следующее:

$ redis-cli 
redis 127.0.0.1:6379> keys * 
1) "_kombu.binding.celery" 
redis 127.0.0.1:6379> select 1 
OK 
redis 127.0.0.1:6379[1]> keys * 
1) "_kombu.binding.celery" 
2) "_kombu.binding.celeryd.pidbox" 
redis 127.0.0.1:6379[1]>

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

Задача 2

$ ps aux | grep celeryd | cut -c 13-120 
 41258   0.2  0.2  2526232   9440 s004  S+    2:27PM   0:07.35 python 
manage.py celeryd -c 4 --loglevel=DEBU 
 41261   0.0  0.1  2458320   2468 s004  S+    2:27PM   0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
 38457   0.0  0.8  2559848  34672 s004  T    12:34PM   0:18.59 python 
manage.py celeryd -c 4 --loglevel=INFO 
 38449   0.0  0.9  2517244  36752 s004  T    12:34PM   0:35.72 python 
manage.py celeryd -c 4 --loglevel=INFO 
 38443   0.0  0.2  2524136   6456 s004  T    12:34PM   0:10.15 python 
manage.py celeryd -c 4 --loglevel=INFO 
 84542   0.0  0.0  2460112      4 s000  T    27Jan12   0:00.74 python 
manage.py celeryd -c 4 --loglevel=INFO 
 84536   0.0  0.0  2506728      4 s000  T    27Jan12   0:00.51 python 
manage.py celeryd -c 4 --loglevel=INFO 
 41485   0.0  0.0  2435120    564 s000  S+    2:54PM   0:00.00 grep 
celeryd 
 41264   0.0  0.1  2458320   2480 s004  S+    2:27PM   0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
 41263   0.0  0.1  2458320   2480 s004  S+    2:27PM   0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 
 41262   0.0  0.1  2458320   2480 s004  S+    2:27PM   0:00.09 python 
manage.py celeryd -c 4 --loglevel=DEBU 

Если бы кто-нибудь мог объяснить мне это, было бы здорово.

Ответы [ 2 ]

9 голосов
/ 09 февраля 2012

Ваша конфигурация имеет CELERY_ALWAYS_EAGER = True.Это означает, что задачи выполняются локально, и поэтому вы не увидите их в Redis.Из документов: http://celery.readthedocs.org/en/latest/configuration.html#celery-always-eager

CELERY_ALWAYS_EAGER

Если это True, все задачи будут выполняться локально путем блокировки, пока задача не вернется.apply_async () и Task.delay () вернут экземпляр EagerResult, который эмулирует API и поведение AsyncResult, за исключением того, что результат уже оценен.

То есть задачи будут выполняться локально, а не отправляться вочередь.

1 голос
/ 08 февраля 2012

Никогда не использовал Celery, но если вы хотите понять, что он делает, один из способов сделать это - подключиться к экземпляру Redis с помощью redis-cli и запустить команду monitor.Это сбросит все команды, выполняемые с базой данных Redis.Вы сможете точно увидеть, что происходит.

...