RabbitMQ在主题交换机上的扇出。

4
我对RabbitMQ还不太熟悉,我们仍处于调查阶段,以确定它是否适合我们的使用情况。我们已经得出结论,我们期望的拓扑结构将使我们部署一些基于主题的交换机,然后从那里过滤到特定的队列。例如,假设我们有一个用户和上传交换机,其中用户队列可能接收主题为“new-registration”或“friend-request”的消息,而上传交换机可能接收诸如“video-upload”或“picture-upload”的消息。
创建队列,将它们路由到适当的队列,然后构建监听程序来处理各种队列的消息非常简单明了。
但是我不清楚是否可以在主题交换机上执行广播?也就是说,我有命名队列绑定到我的主题交换机,但我想能够只需将大量实例的监听器投放到这些队列中,以避免单点故障。但据我所知,RabbitMQ会按照轮询方式处理这些监听器-例如,每N个消息总是发送到同样的第N个监听器,而不是将消息分派给第一个可用的消费者。这通常对我们来说是可以接受的,但考虑到我们预计的负载,我们希望避免消费者群中出现热点的可能性。
因此,是否有一些方法,无论是在队列或交换机配置中还是在消费者代码中,我们可以将监听器指向主题队列,但让监听器以广播方式处理?
3个回答

5

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

扇出是1:N的,即每个任务可以像发布-订阅一样传递给多个监听器。请注意,这不仅限于扇出交换机,而且还适用于将多个队列与具有相同绑定键的直接或主题交换机进行绑定。(安装管理插件并查看其中的交换机可能有助于可视化生效的绑定。)

您目前的设置是任务队列。每个任务/消息都会发送到一个工作程序/监听器。将更多的监听器加入相同的队列名称,它们将像您所说的循环处理任务。使用“扇形输出”(针对主题的单独队列)将多次处理任务。

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


0

我不确定,但我强烈怀疑RabbitMQ会跳过未确认消息的消费者,因此它永远不应该在单个卡住的消费者上形成瓶颈。他们FAQ上的评论似乎表明,即使存在问题消费者,RabbitMQ也会努力保持事情顺畅运行。


0
这是一个晚回答,但如果其他人遇到这个问题...... 听起来你想要的是公平分配而不是扇出模型(它会将给定的消息发布到每个队列)。
公平分派将把消息交给下一个可用的工作进程,而不是使用简单的轮询方法。这应该可以避免你所担心的“热点”,而不会将同一条消息传递给多个消费者。
如果这就是你要找的东西,请参见Rabbit文档中this page上的“公平分派”部分。这里的关键是prefetch计数为1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接