【问题标题】:Avail same messages to multiple RabbitMQ Consumers向多个 RabbitMQ 消费者提供相同的消息
【发布时间】:2015-04-30 08:37:16
【问题描述】:

要求: 1)我需要通过Java应用程序获取存储在Mongo DB中的数据,并使用主题交换和绑定键,在RabbitMQ上创建了3个队列。到目前为止,我已经实现了一切。

问题从第二点开始。

2) 当消息应该可供来自所有 3 个队列的多个消费者使用时。但是当第一个消费者消费来自 3 个队列的消息时,其他消费者将无法使用它。如何使消息对多个消费者高度可用。

是否有任何方法可以实现这一点,或者这个要求是否有任何替代解决方案。

【问题讨论】:

    标签: spring rabbitmq spring-amqp spring-rabbit rabbitmq-exchange


    【解决方案1】:

    您的所有消费者都必须提供自己唯一的queue,并将其绑定到同一个exchange

    在 AMQP 中没有这样的 Topic 抽象,就像在 JMS 中一样。

    即使我们可以通过主题或扇出交换发布消息,消息也会作为单个条目放置到队列中,因此只有一个消费者能够从队列中获取它。

    我的提议的配置可能如下所示:

    <queue id="commandQueue" name="#{node.id}.command"
           auto-delete="true"/>
    
    <fanout-exchange name="commandsExchange">
        <bindings>
            <binding queue="commandQueue"/>
        </bindings>
    </fanout-exchange>
    
    <amqp:inbound-channel-adapter id="commandConsumer"
                                  queue-names="#{commandQueue.name}"
                                  channel="commandChannel"/>
    

    这样,我的所有应用程序实例将它们唯一的queue(基于node.id 抽象)绑定到相同的commandsExchange。并且发布到commandsExchange 的消息将被传递到我的所有节点。

    auto-delete="true" 帮助我避免在节点死亡时为我的队列发送额外消息。

    HTH

    【讨论】:

    • 感谢 Artem 的精彩建议。我将尝试按照建议实施.. 让我拿出我的发现...