RabbitMQ热衷于主题交流

时间:2011-03-09 23:21:01

标签: rabbitmq

RabbitMQ相当新,我们仍处于调查阶段,看它是否适合我们的用例 -

我们很容易得出结论,我们所需的拓扑结构将让我们部署一些基于主题的交换,然后从那里过滤到特定的队列。例如,假设我们有一个用户和一个上传交换,其中用户队列可能会收到主题为“新注册”或“朋友请求”的消息,并且上传交换可能会收到“视频上传”等消息或“图片上传”。

创建队列,将它们路由到适当的队列,然后构建侦听器以处理各种队列的消息非常简单。

然而,我不清楚是否有可能在主题交换上进行扇动?

即。我已经命名了与我的主题交换绑定的队列,但是我希望能够在这些队列中抛出大量的侦听器实例以防止单点故障。但据我所知,RabbitMQ以直接的循环方式对待这些听众 - 例如。每个第N个消息总是转到相同的第N个侦听器,而不是将消息分派给第一个可用的消费者。这通常是我们可以接受的,但考虑到我们预期的负担,我们希望避免在我们的消费者农场中出现热点的可能性。

那么,是否有某种方式,无论是在队列或交换配置中还是在消费者代码中,我们可以将我们的侦听器指向主题队列但是以扇出方式处理侦听器?

3 个答案:

答案 0 :(得分:5)

是的,通过让侦听器使用不同的队列名称绑定,它们将以扇出方式处理。

扇出是1:N,即每个任务都可以传递给多个听众,如pub-sub。请注意,这不仅限于扇出交换,也适用于将多个队列绑定到具有相同绑定密钥的直接或主题交换的情况。 (安装管理插件并查看交换可能有助于可视化有效的绑定。)

您当前的设置是一个任务队列。每个任务/消息都传递给一个工作者/监听者。在同一个队列名称中抛出更多的侦听器,他们将像你说的那样循环处理任务。使用“扇出”(主题的单独队列),您将多次处理任务。

根据您的平台,可能存在满足您要求的现有工作队列解决方案,例如用于Ruby的Resque或DelayedJob,用于Python的Celery或用于JVM的Octobot或Akka。

答案 1 :(得分:0)

我不知道一个事实,但我强烈怀疑RabbitMQ会使用未经确认的消息跳过消费者,所以它永远不会成为一个卡住的消费者的瓶颈。对他们FAQ的评论似乎表明,即使在麻烦的消费者面前,RabbitMQ也会努力保持活力。

答案 2 :(得分:0)

这是一个迟到的答案,但万一其他人遇到这个问题...... 这听起来像你想要的是公平的调度而不是扇出模型(它会将给定的消息发布到每个队列)。

公平调度将向下一个可用的工作人员发送消息,而不是使用简单的循环方法。这应避免您关注的“热点”,而不向多个消费者传递相同的消息。

如果这是您正在寻找的内容,请参阅Rabbit文档中this page上的“公平调度”部分。 prefetch计数为1是此处的关键。