Имаме Джанго 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 секунди. Това накара всички работници на опашка.