【问题标题】:In ActiveMQ, is there a way to send a copy of message from one queue to another queue in a remote broker?在 ActiveMQ 中,有没有办法将消息副本从一个队列发送到远程代理中的另一个队列?
【发布时间】:2021-07-01 22:54:08
【问题描述】:

问题说明:两个不同的broker有两个Queue。每个队列都有一个消费者。生产者正在第一个队列上丢弃消息。我们希望将消息副本发送到第二个队列。可视化

                 制作人
|

Broker1 --> Queue1 --> Consumer1
| (复制)
Broker2 --> Queue2 --> Consumer2(消费与Consumer1相同的消息,但独立于Consumer1)

问题是

  1. 在每个代理中仅创建 1 个队列。我已经通过 4 个队列实现了上述目标,但正在寻找更优化的解决方案。
  2. 不希望使用任何主题。
  3. 只能通过 activemq 提供的配置来完成。

到目前为止我做了什么: 我设法用 4 个队列完成了上述操作。 在 Broker1 中,Queue1 将副本转发到虚拟目标队列。此外,通过网络连接器将虚拟目的地中的消息发送到代理 2。

    <destinationInterceptors>
        <virtualDestinationInterceptor>
            <virtualDestinations>
                <compositeQueue name="Queue1" forwardOnly="false">
                    <forwardTo>
                        <queue physicalName="IntermediateQueue"/>
                    </forwardTo>
                </compositeQueue>
            </virtualDestinations>
        </virtualDestinationInterceptor>
    </destinationInterceptors>

    
    <networkConnectors>
     <networkConnector 
        name="Q:broker1->broker2" 
        uri="static:(tcp://localhost:31616)" 
        duplex="false" 
        staticBridge="true">
        <staticallyIncludedDestinations>
            <queue physicalName="IntermediateQueue"/>
        </staticallyIncludedDestinations>
     </networkConnector>
 </networkConnectors>
 

在 Broker2 中,将中间 Queue 中收到的所有消息转发到实际的目标队列。

    <destinationInterceptors>
      <virtualDestinationInterceptor>
        <virtualDestinations>
          <compositeQueue name="IntermediateQueue">
            <forwardTo>
              <queue physicalName="FinalDestinationQueue" />
            </forwardTo>
          </compositeQueue>
        </virtualDestinations>
      </virtualDestinationInterceptor>
    </destinationInterceptors> 

感谢任何帮助,因为浏览 activemq 文档和论坛并没有为这个问题提供优化的答案。

【问题讨论】:

    标签: activemq


    【解决方案1】:

    您实际上是在重新创建 pub+sub,然后添加传输队列模式以实现多代理集成。有有效的用例可以做到这一点,您的方法是有效的,并且在复合目的地和网络连接器的预期设计范围内。这种方法的权衡是需要繁重的管理和配置管理。

    我了解您不喜欢使用主题。但是,您可以考虑查看 Virtual Topics1,它以一种优雅的方式解决了这个问题,并允许您动态添加新的消费者,而无需修改代理配置。

    生产者发送到主题:

    topic://VT.ORDER.EVENT

    消费者从特殊命名队列中读取

    clientA: queue://VQ.CLIENTA.VT.ORDER.EVENT

    clientB: queue://VQ.CLIENTB.VT.ORDER.EVENT

    参考:Virtual Topics

    【讨论】:

    • 感谢您的反馈。我对您提到的虚拟主题方法感兴趣。但是,在阅读了文档后,我没有发现如何在其他经纪人之间共享相同的内容。纠正我,如果以下不是您所暗示的。生产者 --> Queue1(Broker1) --> VT.ORDER.EVENT(Broker1) --> VQ.CLIENTA.VT.ORDER.EVENT(Broker1) = Consumer1 消费,VQ.CLIENTB.VT.ORDER.EVENT(Broker1 ) --> Queue2 (Broker2) = Consumer2 消费
    • 生产者 -- 客户端发送 --> VT.ORDER.EVENT (Broker1) -- Broker1 虚拟主题拦截器 -> VQ.CLIENTA.VT.ORDER.EVENT 和 VQ.CLIENTB.VT.ORDER。活动
    • VQ.CLIENTA.VT.ORDER.EVENT 和 VQ.CLIENTB.VT.ORDER.EVENT 在代理 1 还是 2 中?如果它在 Broker2 上,您能否分享任何可以使其工作的链接或 .conf 示例?
    • 同一经纪人。队列名称“CLIENTA”和“CLIENTB”的第二部分是 VirtualTopics 如何根据不同消费应用程序的标识符分离队列。虚拟主题可以根据需要分布在网络连接器上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2014-04-13
    • 2016-02-21
    相关资源
    最近更新 更多