我最近和Celery一起工作,我不喜欢它。它的配置混乱,过于复杂,文档记录不足。
我想将Celery的广播消息从单个制作人发送给多个消费者。令我困惑的是Celery术语与底层传输RabbitMQ之间的差异。
在RabbitMQ中,您可以使用一个fanout Exchange和多个队列来广播消息:
但是在Celery中,条款都搞砸了:在这里你可以有一个broadcast Queue,它向多个消费者发送消息:
我甚至不理解,Celery广播队列应该如何工作,导致具有多个消费者的RabbitMQ队列用于负载平衡。因此,在RabbitMQ中,如果多个消费者(即消费者池)连接到同一队列,则只有一个消费者将接收并处理消息which is called round robin in RabbitMQ docs。
此外,关于广播的Celery文档确实不够。我应该为广播队列指定什么类型的RabbitMQ交换,扇出与否?你能提供一个完整的例子吗?
因此,我要求的是(1)澄清Celery中广播队列的概念和实现,以及(2)广播队列配置的完整示例。谢谢。
答案 0 :(得分:3)
查看了代码(它位于kombu.common
包中,而不是celery
)并尝试了它,它似乎是这样的:
Broadcast
'队列'。Exchange
,以及一个具有唯一ID(auto_delete
)的uuid
队列,以及别名'foo'(我不认为)别名实际上是在任何地方使用的,它只是供参考,因为队列的真实姓名是随机生成的)因此,该类名为Broadcast
,但它实际上是一个绑定到扇出交换的唯一命名队列。因此,当每个工作程序启动时,它会创建自己的唯一队列并绑定到扇出交换。
答案 1 :(得分:2)
这有帮助吗?
http://celery.readthedocs.org/en/latest/userguide/routing.html#exchanges-queues-and-routing-keys
它似乎是排队' Celery中的定义包括交换,因此您可以在Exchange('fanout')
交换类型之上定义Celery队列,该队列将具有多个RabbitMQ队列的底层实现。
在这种情况下,我猜你不想要一个'广播'在Celery配置中排队,除非您真的希望多个工作人员处理相同的任务。
答案 2 :(得分:1)
如果您使用的是Celery 4.0.1+,并且广播不适合您,请检查https://github.com/celery/celery/pull/3934并查看clokep的解决方案,它会恢复以前版本的amqp.py并且适用于我