Dav*_*ver 6 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='media.images'),
)
Run Code Online (Sandbox Code Playgroud)
在停止所有工人之后,我跑了:
>>> tasks.ping.apply_async(queue='default')
Run Code Online (Sandbox Code Playgroud)
我可以看到任务出现在两者中default和client1队列:
$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 1
Run Code Online (Sandbox Code Playgroud)
这仅适用于default队列.直接将其发送到client1队列只会将其添加到那里:
>>> tasks.ping.apply_async(queue='client1')
$ redis-cli -c llen default
(integer) 1
$ redis-cli -c llen client1
(integer) 2
Run Code Online (Sandbox Code Playgroud)
该images队列从不正确接收任务.
这是Celery 3.1.15与Redis经纪人.
好的!看起来问题是Kombu的Redis经纪人没有清除旧的交换+路由密钥.
最初我配置了队列:
CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),
Queue('client1', Exchange('default'), routing_key='default'),
)
Run Code Online (Sandbox Code Playgroud)
后来改为使用单独的交换和路由密钥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"
Run Code Online (Sandbox Code Playgroud)
因此发送到的任务default被路由到队列default和client1队列.
解决方法是删除不正确的绑定:
redis> srem _kombu.binding.default "default\x06\x16\x06\x16client1"
redis> srem _kombu.binding.default "default.client1\x06\x16\x06\x16client1"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |