【问题标题】:Celery occasionally ignoring CELERY_TASK_DEFAULT_QUEUE芹菜偶尔会忽略 CELERY_TASK_DEFAULT_QUEUE
【发布时间】:2019-12-26 07:05:45
【问题描述】:

我有一个运行 Python 2.7、Django 1.11 和 Celery 4.3(prefork)以及 RabbitMQ 代理的 Django 应用程序和 celery worker。

有时,应用程序或 celery worker 似乎会“忘记”它已被配置为通过 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 队列偏离了轨道。

但是,这只是运行大约 5 小时后的一种情况,其中会发生对该任务的许多实际调用。我想我可能需要记录其他内容来确定 Celery 应用程序认为它的样子,以查看应用程序的确切配置。

【问题讨论】:

  • 会不会是“内部”Celery 任务(如星图等)在“celery”队列中运行?理论上,您可以设置监控(查找 Celery 事件)并找出哪个任务被发送到“celery”队列,然后尝试找出发生这种情况的原因。 - 是芹菜虫还是别的什么。
  • Ty,我试试看。我还在考虑为 Celery 应用程序设置一个任务路由器,即使所有任务都应该进入同一个队列。使用路由器可能会隐藏最初的问题,但只要一切正常,我就可以。不过,我会先尝试监控。

标签: celery


【解决方案1】:

原来,应用程序将 celery 请求提交到其他队列。

默认情况下,当一个 Celery 实例被创建时,它也会成为当前应用。

如果您正在为将由其他应用程序处理的请求创建 Celery 实例,请确保在创建这些 Celery 实例时传递set_as_current=False,这样它就不会干扰向您的应用程序提交任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多