/ / Django-celery и RabbitMQ не изпълняват задачи - django, rabbitmq, целина, опашка за съобщения, django-celer

Джанго-целина и RabbitMQ не изпълнява задачи - django, rabbitmq, целина, опашка за съобщения, django-целина

Имаме Джанго 1.3 приложение с django-celer 2.5.5 това се върти добре в производството за месец, но внезапно една от задачите на целина не успява да изпълни сега.

Работещите в RabbitMQ брокери и целина се изпълняват на отделна машина и celeryconfig.py е конфигуриран да използва този конкретен RabbitMQ инстанция като бекенд.

На сървъра на приложения се опитах ръчно да изстрелям целина чрез python manage.py shell.

Действителната задача се нарича така:

>>> result = tasks.runCodeGeneration.delay(code_generation, None)
>>> result
<AsyncResult: 853daa7b-8be5-4a25-a1d0-1552b38a0d21>
>>> result.state
"PENDING"

Тя връща AsyncResult както се очаква, но статутът му е вечен "PENDING".

За да види дали брокерът на RabbitMQ е получил съобщението, стартирах следното:

$ rabbitmqctl list_queues name messages messages_ready messages_unacknowledged | grep 853daa
853daa7b8be54a25a1d01552b38a0d21        0       0       0

Аз не съм сигурен какво означава това, разбира сеизглежда получава някаква заявка, в противен случай как иначе би могло да се създаде опашка за задачата с id: 853daa7b8be54a25a1d01552b38a0d21. То просто не притежава никакви съобщения?

Опитах се да рестартирам и целина, и RabbitMQ и проблемът продължава.

Целината се изпълнява така: $ python /home/[project]/console/manage.py celeryd -B -c2 --loglevel=INFO

Обърнете внимание, че задачите за целина / планираните задачи изглеждат добре.

[РЕДАКТИРАНЕ]: Няма конфигурация на RabbitMQ, тъй като е вкарана от скрипта init.d: /usr/lib/erlang/erts-5.8.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@hostname -boot /var/lib/rabbitmq/mnesia/rabbit@hostname-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbit@hostname.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@hostname-sasl.log"} -os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@hostname"

[EDIT2]: Тук е целина, която използваме за работниците. Същият конфиг се използва и за производителя, с изключение, разбира се, localhost се променя на полето с RabbitMQ брокер.

from datetime import timedelta

BROKER_HOST = "localhost"

BROKER_PORT = 5672
BROKER_USER = "console"
BROKER_PASSWORD = "console"

BROKER_VHOST = "console"
BROKER_URL = "amqp://guest:guest@localhost:5672//"

CELERY_RESULT_BACKEND = "amqp"

CELERY_IMPORTS = ("tasks", )

CELERYD_HIJACK_ROOT_LOGGER = True
CELERYD_LOG_FORMAT = "[%(asctime)s: %(levelname)s/%(processName)s/%(name)s] %(message)s"


CELERYBEAT_SCHEDULE = {
"runs-every-60-seconds": {
"task": "tasks.runMapReduceQueries",
"schedule": timedelta(seconds=60),
"args": ()
},
}

[EDIT3]: Нашата инфраструктура е създадена като номер 2 по-долу: Работник от целина / приложение за брокери и джанго-целина

Отговори:

2 за отговор № 1

Решихме проблема.

Имаше отдавна изпълнена задача за целина (~ 430s), която се планираше да се изпълнява на всеки 60 секунди. Това накара всички работници на опашка.