RabbitMQ和循环主题交换

18

我希望能够获得有关如何最佳配置我的rabbitMQ exchanges的建议。

我正在尝试使用主题交换以循环方式进行消息路由。每个消费者都有自己(唯一)命名的队列与一个主题交换相连。我希望交换将相同主题的消息循环发送到每个消费者队列上,例如*.log

我已经尝试了多种组合,但似乎只能同时将消息发送到消费者队列中,这有效地意味着我在每个消费者中处理消息两次。

为了明确起见,我还有一个fanout交换机,用于“控制”消费者(启动、停止等)。这应该在任何情况下都保持不变。

如果能够提供关于如何最好实现所述结果的任何指导和建议都将是有益的。


3
你为什么想要循环分配消息?如果你想要分发工作,那就将所有内容放入一个队列中,并让多个“日志文件”消费者从该队列中读取... - kzhen
想知道一样的问题。你找到了什么解决方案? - YaOg
我使用端对端(exchange-to-exchange)绑定解决了这个问题。http://stackoverflow.com/a/39577177/67065 - raine
2个回答

18

每个消费者都有一个独特命名的队列,附加到一个主题交换机上

关键是让想要轮询的每个工作者/消费者都设置一个命名队列,并且所有人都使用相同的队列,而不是创建自己的队列。

因此,您可以为所有“日志”工作者创建名为“log”的命名队列。您可以为所有“foo”工作者创建不同的命名队列。请求将循环发送到查看相同队列的所有消费者。


10
在更大的规模上,这会带来问题。一个队列驻留在一个单独的节点上(高可用性策略除外),无法扩展到单个节点之外。拥有多个队列可以提供水平扩展性,这在处理大量消息时非常重要。 - Wjdavis5
@Wjdavis5 - 那么在保持主题交换的好处/灵活性的同时,有没有一种实现水平扩展的方法? - Josh

-2

要以循环方式使用RabbitMQ,最好使用直接交换而不是主题交换。

直接交换非常适合单播消息路由(尽管它们也可以用于多播路由)。

  • 队列使用路由键K绑定到交换。
  • 当具有路由键R的新消息到达直接交换时,如果K = R,则交换将其路由到队列。

通常使用直接交换在多个工作进程之间以循环方式分配任务。这样做时,重要的是要了解,消息在消费者之间负载平衡,而不是在队列之间。


1
作者特别询问在交换机上以轮询方式分发消息的可能性。对于此,生产者不知道消费者的情况。在您的回答中,当例如两个队列使用相同的路由键绑定到一个交换机时,消息会被传递两次。 - Hardy Hobeck

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