2011-03-09 66 views
3

相当新的RabbitMQ的,我们现在还处于调查阶段,看它是否是一个很好的适合我们使用cases--RabbitMQ的扇出

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

创建队列,让他们路由到适当的队列,然后建立侦听器来处理消息的各种队列已经相当直截了当。

什么我不清楚但是是是否有可能做一个主题交换扇出?

I.e.我已经命名了与我的主题交换绑定的队列,但是我希望能够将这些队列中的吨监听器实例放在这些队列中,以防止发生单点故障。但据我所知,RabbitMQ以一种简单的循环方式对待这些听众 - 例如,每一个第N条消息总是到达相同的第N个监听器,而不是将消息分派给第一个可用的使用者。这通常是我们可以接受的,但考虑到我们预期的负荷,我们希望避免在我们的消费农场中发现热点的可能性。

所以,有一些方法,无论是在队列或交换配置中的消费代码,在这里我们可以指出我们的听众一个主题队列但在扇出的方式对待听众?

回答

0

,我不知道一个事实,但我强烈怀疑的RabbitMQ将跳过消费者未确认的消息,所以它不应该在一个单一卡消费的瓶颈。对其FAQ的评论似乎表明RabbitMQ将努力保持事情的持续性,即使在麻烦的消费者面前。

5

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

扇出是1:N虽然,即,每个任务可以被递送到多个侦听像发布 - 订阅。请注意,这不仅限于扇出交换,还适用于使用相同绑定密钥将多个队列绑定到直接交换或主题交换的情况。 (安装管理插件,并在寻找的交流有可能会在可视化效果绑定有用。)

您当前的设置是一个任务队列。每个任务/消息只传递给一个工作人员/听众。以相同的队列名称引发更多的侦听器,并按照您的说法循环处理任务。使用“扇出”(针对某个主题的单独队列),您将多次处理任务。

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

0

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

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

如果这是您正在寻找的内容,请参阅Rabbit文档中关于this page的“Fair Dispatch”部分。 A prefetch计数为1是这里的关键。