Python 芹菜任务被发送到多个队列

Python 芹菜任务被发送到多个队列,python,redis,celery,Python,Redis,Celery,我注意到芹菜一直在向多个队列发送任务,两个队列上的工作人员都在执行任务 我的队列定义是: CELERY_QUEUES = ( Queue('default', Exchange('default'), routing_key='default'), Queue('client1', Exchange('client1'), routing_key='client1'), Queue('images', Exchange('media'), routing_key='med

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

我的队列定义是:

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')
我可以在
default
client1
队列中看到任务:

$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 1
这仅适用于
默认队列。将其直接发送到
client1
队列只会将其添加到那里:

>>> tasks.ping.apply_async(queue='client1')
$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 2
图像
队列从不错误地接收任务


这是Redis broker的芹菜3.1.15。

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

最初,我配置了队列:

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
的任务被路由到
default
client1
队列

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

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