我注意到芹菜已经将任务发送到多个队列,两个队列中的工作人员一直在执行任务.
我的队列定义是:
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
图像队列永远不会错误地接收任务.
这是Celery 3.1.15与Redis经纪人.
解决方法
好的!看起来问题是Kombu的Redis经纪人没有清除旧的交换路由密钥.
最初我配置了队列:
CELERY_QUEUES = ( Queue('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和client1队列.
redis> srem _kombu.binding.default "default\x06\x16\x06\x16client1" redis> srem _kombu.binding.default "default.client1\x06\x16\x06\x16client1"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。