我们已经有了带有django-celery 2.5.5的Django 1.3应用程序,该应用程序在生产中已经可以运行一个月了,但是所有突然出现的celery任务之一现在都无法执行。
RabbitMQ代理和Celery工作者在单独的计算机上运行,并且celeryconfig.py配置为使用该特定RabbitMQ实例作为后端。
在应用程序服务器上,我尝试通过手动启动celery任务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
我不确定这意味着什么,RabbitMQ当然似乎收到某种请求,否则如何为ID为853daa7b8be54a25a1d01552b38a0d21的任务创建队列。它似乎没有任何消息吗?
我尝试重新启动Celery和RabbitMQ,问题仍然存在。
芹菜的运行方式如下: $ python /home/[project]/console/manage.py celeryd -B -c2 --loglevel=INFO
请注意,celerybeat /计划任务似乎运行良好。
[编辑]:没有init.d脚本内联的RabbitMQ配置: /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/[email protected]"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/[email protected]"} -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]:这是我们用于工作人员的celeryconfig。生产者使用相同的配置,除了将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所示:
我们解决了这个问题。
有一个长期运行的celerybeat任务(〜430s)被安排为每60秒运行一次。这把所有工人排成一排。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句