【问题标题】:Celery tasks being sent to multiple queues芹菜任务被发送到多个队列
【发布时间】:2016-01-28 18:28:23
【问题描述】:

我注意到 celery 一直在向多个队列发送任务,并且两个队列上的工作人员都在执行任务。

我的队列定义是:

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('client1', Exchange('client1'), routing_key='client1'),
    Queue('images', Exchange('media'), routing_key='media.images'),
)

当我停止所有工人后,我运行:

>>> tasks.ping.apply_async(queue='default')

我可以看到任务出现在两个defaultclient1 队列中:

$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 1

这仅适用于default 队列。将其直接发送到client1 队列只会将其添加到那里:

>>> tasks.ping.apply_async(queue='client1')
$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 2

images 队列永远不会错误地接收任务。

这是带有 Redis 代理的 Celery 3.1.15。

【问题讨论】:

    标签: python redis celery


    【解决方案1】:

    好的!看起来问题在于 Kombu 的 Redis 代理没有清除旧的交换 + 路由密钥。

    最初我已经配置了队列:

    CELERY_QUEUES = (
        Queue('default', Exchange('default'), routing_key='default'),
        Queue('client1', Exchange('default'), routing_key='default'),
    )
    

    后来将它们更改为对client1 使用单独的交换和路由密钥。

    但由于某种原因,Kombu 没有清除旧绑定,所以我只剩下:

    redis> smembers _kombu.binding.default
    1) "default\x06\x16\x06\x16client1"
    2) "default.client1\x06\x16\x06\x16client1"
    3) "default\x06\x16\x06\x16default"
    

    所以发送到default 的任务被路由到defaultclient1 队列。

    修复是删除不正确的绑定:

    redis> srem _kombu.binding.default "default\x06\x16\x06\x16client1"
    redis> srem _kombu.binding.default "default.client1\x06\x16\x06\x16client1"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2020-01-04
      • 2011-07-29
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多