Máme Django 1.3 s aplikáciou django-zeler 2.5.5 to je v poriadku vo výrobe už mesiac, ale zrazu jedna zo zelerových úloh sa teraz nedarí vykonať.
Sprostredkovateľ RabbitMQ a pracovníci Celery pracujú na samostatnom počítači a celeryconfig.py je nakonfigurovaný tak, aby používal túto konkrétnu inštanciu RabbitMQ ako backend.
Na aplikačnom serveri som sa pokúsil manuálne vypáliť zeler cez python manage.py shell
.
Skutočná úloha sa nazýva takto:
>>> result = tasks.runCodeGeneration.delay(code_generation, None)
>>> result
<AsyncResult: 853daa7b-8be5-4a25-a1d0-1552b38a0d21>
>>> result.state
"PENDING"
Vracia AsyncResult
podľa očakávania, ale jeho stav je navždy "PENDING"
.
Ak chcete zistiť, či sprostredkovateľ RabbitMQ dostal správu, spustil som nasledujúce:
$ rabbitmqctl list_queues name messages messages_ready messages_unacknowledged | grep 853daa
853daa7b8be54a25a1d01552b38a0d21 0 0 0
Nie som si istý, čo to znamená, RabbitMQ určiteZdá sa, že dostane nejakú požiadavku, inak by sa dalo vytvoriť frontu pre úlohu s ID: 853daa7b8be54a25a1d01552b38a0d21. Nezdá sa, že by nejaké správy obsahoval?
Skúsil som reštartovať Celery aj RabbitMQ a problém pretrváva.
Zeler sa chová takto: $ python /home/[project]/console/manage.py celeryd -B -c2 --loglevel=INFO
Všimnite si, že úlohy spojené s celerom / naplánované úlohy sa zdajú byť v poriadku.
[EDIT]: Neexistuje žiadna konfigurácia RabbitMQ, ako je zdôraznená skriptom 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]: Tu uvádzame zeler, ktorý používame pre pracovníkov. Rovnaká konfigurácia sa používa pre výrobcu s výnimkou, že localhost sa samozrejme zmení na krabicu, na ktorej je sprostredkovateľ 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]: Naša infraštruktúra je nastavená ako číslo 2 nižšie:
odpovede:
2 pre odpoveď č. 1Tento problém sme vyriešili.
Bola naplánovaná dlhotrvajúca úloha pre celery (~ 430 s), ktorá sa mala spúšťať každých 60 sekúnd. To zabavilo všetkých pracovníkov vo fronte.