【问题标题】:RabbitMQ and round robin topic exchangesRabbitMQ 和轮询主题交流
【发布时间】:2022-04-22 03:25:35
【问题描述】:

我正在寻求一些关于如何最好地配置我的 rabbitMQ 交换的建议。

我正在尝试在循环方法中使用主题交换。每个消费者都有自己的(唯一的)命名队列附加到主题交换。我希望交换能够为“相同”主题的每个消费者队列循环发送消息 - 例如*.log

我尝试了多种组合,但似乎只能同时将消息传递到消费者队列,这实际上意味着我要处理两次消息,每个消费者一次。

为了清楚起见,我还有一个扇出交换,我用它来“控制”消费者(启动、停止等)。这应该在任何结果中保持不变。

任何关于如何最好地实现所述结果的指导都会很棒。

【问题讨论】:

  • 为什么要轮询消息?如果您想分发工作,则将其全部泵入一个队列并让多个“日志文件”消费者从该队列中读取...
  • 希望找到相同的答案。您为此找到了哪种解决方案?
  • 我使用 e2e(交换到交换)绑定解决了这个问题。 stackoverflow.com/a/39577177/67065

标签: rabbitmq


【解决方案1】:

每个消费者都有自己的(唯一的)命名队列,连接到主题交换

诀窍是让您想要在其之间循环的每个工作人员/消费者设置一个命名队列,并使用同一个队列而不是创建自己的队列。

因此,您可以为所有“日志”工作人员创建一个名为“日志”的命名队列。您将为所有“foo”工作人员创建一个不同的命名队列,例如“foo”。请求将循环传递给查看同一队列的所有消费者。

【讨论】:

  • 这在更大范围内是有问题的。队列驻留在单个节点上(除了 ha 策略),并且不能扩展到单个节点之外。拥有多个队列为您提供了水平可扩展性,这对于非平凡的消息率很重要。
【解决方案2】:

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

直接交换是消息单播路由的理想选择(尽管它们也可用于多播路由)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2021-11-28
    • 2014-08-01
    • 2012-03-31
    相关资源
    最近更新 更多