【问题标题】:Deliver message to only one queue bound to a routing key in RabbiqMQ Direct exchange仅将消息传递到绑定到 RabbiqMQ 直接交换中的路由键的一个队列
【发布时间】:2016-03-24 21:13:34
【问题描述】:

我是 RabbitMQ 的新手,这让我很困惑。我已经设置了一个直接交换,并且不同的队列在这个交换上订阅了不同的路由键。我想要的是,如果使用一个路由键发布消息,则无论有多少队列订阅该路由键,它都只会被一个订阅者使用。

当前情景:

交换(类型:直接)

-QueueA1  (receives message A from exchange with routing key of "TypeA")
-QueueA2  (also receive message A from exchange with routing key of "TypeA")
-QueueB  (doesn't receive message A because it subscribes to key "TypeB")

期望:

-QueueA1  (receives message A from exchange with routing key of "TypeA")
-QueueA2  (doesn't receive message A because it's already consumed by QueueA1)
-QueueB  (doesn't receive message A because it subscribes to key "TypeB")

我需要使用其他交易所吗?如何实现所需的场景?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    您可以通过使用单个QueueA 和订阅此队列的多个消费者来实现您想要的:

    Direct exchange
    |
    |-- ["TypeA"]--> QueueA
    |                |-- Consumer A1
    |                `-- Consumer A2
    |
    `-- ["TypeB"]--> QueueB
    

    在这种情况下,QueueA 上排队的消息将仅传递给一个消费者。然而,获取消息的消费者是未定义的:它们是以循环方式挑选的。

    【讨论】:

      【解决方案2】:

      w/ RabbitMQ,在给定交换中匹配的所有路由键,都会有一个消息副本传递到指定队列。

      因此,在您的场景中,您将始终让 QueueA1 和 QueueA2 接收 TypeA 的消息。这就是路由键的工作方式。使用单一交换无法解决此问题。

      如果您需要 QueueA1 和 QueueA2 接收不同的消息,那么您可以:

      • 需要使用不同的路由键来绑定队列,或者
      • 需要使用不同的交易所

      关于 Jean-Sebastient 的建议……

      此方案将允许消费者 A1 消费者 A2 处理有问题的消息,但通过让它们都订阅同一个队列来实现。

      如果您要确保有一个 1 消费者接收消息,那么这就是您想要做的。但是,如果您需要两个队列并且需要确保只有一个队列接收消息,那么您需要使用我建议的其他选项之一。

      最后,如果您希望保证一条消息只被处理一次,这些选项都不会这样做。

      从表面上看,它看起来大部分时间都有效。但在某些情况下会出现问题,您将有多个队列或消费者处理同一条消息。

      要处理这种情况,您需要在消息处理中查看“幂等性”。这通常使用数据库和 ID 来处理,表示它已经被处理过,但还有其他解决方案。

      【讨论】:

        猜你喜欢
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2016-08-14
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多