芹菜广播与RabbitMQ粉丝

时间:2014-06-18 11:36:57

标签: rabbitmq celery

我最近和Celery一起工作,我不喜欢它。它的配置混乱,过于复杂,文档记录不足。

我想将Celery的广播消息从单个制作人发送给多个消费者。令我困惑的是Celery术语与底层传输RabbitMQ之间的差异。

在RabbitMQ中,您可以使用一个fanout Exchange和多个队列来广播消息:

enter image description here

但是在Celery中,条款都搞砸了:在这里你可以有一个broadcast Queue,它向多个消费者发送消息:

enter image description here

我甚至不理解,Celery广播队列应该如何工作,导致具有多个消费者的RabbitMQ队列用于负载平衡。因此,在RabbitMQ中,如果多个消费者(即消费者池)连接到同一队列,则只有一个消费者将接收并处理消息which is called round robin in RabbitMQ docs

此外,关于广播的Celery文档确实不够。我应该为广播队列指定什么类型的RabbitMQ交换,扇出与否?你能提供一个完整的例子吗?

因此,我要求的是(1)澄清Celery中广播队列的概念和实现,以及(2)广播队列配置的完整示例。谢谢。

3 个答案:

答案 0 :(得分:3)

查看了代码(它位于kombu.common包中,而不是celery)并尝试了它,它似乎是这样的:

  • 您在芹菜配置中定义名为'foo'的Broadcast'队列'。
  • 这会创建一个名为'foo'的Exchange,以及一个具有唯一ID(auto_delete)的uuid队列,以及别名'foo'(我不认为)别名实际上是在任何地方使用的,它只是供参考,因为队列的真实姓名是随机生成的)
  • 唯一队列绑定到'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并且适用于我