芹菜偶尔会忽略CELERY_TASK_DEFAULT_QUEUE
Celery occasionally ignoring CELERY_TASK_DEFAULT_QUEUE
我有一个 Django 应用程序和 celery worker 运行 Python 2.7、Django 1.11 和 Celery 4.3(prefork)和 RabbitMQ 代理。
有时,应用程序或 celery worker 似乎会 "forget" 它已被配置为通过 CELERY_TASK_DEFAULT_QUEUE 将任务放在特定队列上,并将任务放在 "celery"队列而不是配置的队列。
发生这种情况的大多数情况是 celery 任务通过 .delay()
.
将另一个任务放入队列时
我无法在开发环境中重现这一点,所以我想知道接下来我可以尝试做什么来弄清楚从任务发出的任务是如何在 celery
队列中结束的而不是配置的 task_default_queue.
更新:
根据@DejanLekic 的建议,我设置了一个 Celery Signal 来监听 before_task_publish 信号,并报告任何与预期不匹配的任务 routing_key.
@before_task_publish.connect
def task_sending_handler(sender=None, headers=None, body=None, exchange=None, routing_key=None, **kwargs):
"""Reports on tasks not send to the source queue. Used to debug tasks not getting put on the source queue"""
if not routing_key == 'source':
info = headers if 'task' in headers else body
logger.info(
'Sending task {info[id]} to exchange {} with routing key {} from sender {} that is not source'.format(
exchange, routing_key, sender, info=info))
现在我有一个任务从另一个任务提交的确认案例,并使用默认的 celery
队列而不是假定配置的 source
队列离开 rails。
但是,这只是运行大约 5 小时后的一种情况,在这种情况下会发生对该任务的多次实际调用。我想我可能需要记录其他内容来计算出 Celery 应用程序认为它看起来像什么,以准确查看应用程序的配置。
原来,应用程序向其他队列提交了芹菜请求。
默认情况下,当一个Celery实例被创建时,它也会成为当前应用。
如果您正在为将由其他应用程序处理的请求创建 Celery 实例,请务必在创建这些 Celery 实例时传递 set_as_current=False
,这样它就不会干扰向您的应用程序提交任务.
我有一个 Django 应用程序和 celery worker 运行 Python 2.7、Django 1.11 和 Celery 4.3(prefork)和 RabbitMQ 代理。
有时,应用程序或 celery worker 似乎会 "forget" 它已被配置为通过 CELERY_TASK_DEFAULT_QUEUE 将任务放在特定队列上,并将任务放在 "celery"队列而不是配置的队列。
发生这种情况的大多数情况是 celery 任务通过 .delay()
.
我无法在开发环境中重现这一点,所以我想知道接下来我可以尝试做什么来弄清楚从任务发出的任务是如何在 celery
队列中结束的而不是配置的 task_default_queue.
更新:
根据@DejanLekic 的建议,我设置了一个 Celery Signal 来监听 before_task_publish 信号,并报告任何与预期不匹配的任务 routing_key.
@before_task_publish.connect
def task_sending_handler(sender=None, headers=None, body=None, exchange=None, routing_key=None, **kwargs):
"""Reports on tasks not send to the source queue. Used to debug tasks not getting put on the source queue"""
if not routing_key == 'source':
info = headers if 'task' in headers else body
logger.info(
'Sending task {info[id]} to exchange {} with routing key {} from sender {} that is not source'.format(
exchange, routing_key, sender, info=info))
现在我有一个任务从另一个任务提交的确认案例,并使用默认的 celery
队列而不是假定配置的 source
队列离开 rails。
但是,这只是运行大约 5 小时后的一种情况,在这种情况下会发生对该任务的多次实际调用。我想我可能需要记录其他内容来计算出 Celery 应用程序认为它看起来像什么,以准确查看应用程序的配置。
原来,应用程序向其他队列提交了芹菜请求。
默认情况下,当一个Celery实例被创建时,它也会成为当前应用。
如果您正在为将由其他应用程序处理的请求创建 Celery 实例,请务必在创建这些 Celery 实例时传递 set_as_current=False
,这样它就不会干扰向您的应用程序提交任务.