【问题标题】:Maintain order of messages while forwarding messages between two ActiveMQ brokers在两个 ActiveMQ 代理之间转发消息时保持消息的顺序
【发布时间】:2015-10-28 22:43:30
【问题描述】:

我有一个 ActiveMQ 设置,其中一个数据中心的源代理将到达特定主题的所有消息转发到另一个数据中心的目标代理。消费者应用程序仅使用来自目标代理的消息。 (这个设置主要是为了保证两个数据中心之间消息的快速高效转发。)

转发配置如下所示:

<networkConnectors>
  <networkConnector name="Q:DontForwardQueueMessages"
    uri="static:(tcp://destination-broker.example.com:61616)"
    duplex="false" decreaseNetworkConsumerPriority="true" networkTTL="2"
    dynamicOnly="true">
    <excludedDestinations>
      <queue physicalName=">" />
    </excludedDestinations>
  </networkConnector>
  <networkConnector name="T:ForwardSampleMessages"
    uri="static:(tcp://destination-broker.example.com:61616)"
    duplex="false" decreaseNetworkConsumerPriority="true" networkTTL="2"
    dynamicOnly="true">
    <excludedDestinations>
      <topic physicalName=">" />
    </excludedDestinations>
    <staticallyIncludedDestinations>
      <topic physicalName="SampleTopic1" />
      <topic physicalName="SampleTopic2" />
      <topic physicalName="SampleTopic3" />
      <topic physicalName="SampleTopic4" />
    </staticallyIncludedDestinations>
  </networkConnector>
</networkConnectors>

我们的应用程序需要维护消息顺序。但是,当目标代理出现故障时,我们会丢失消息。到达源代理的消息在主题中堆积,但在重新建立与目标代理的连接时不会被转发。但是,重新连接后到达的消息会照常转发。

我正在寻找一种可以配置设置的方法,以便:

  • 在重新连接目标后立即发送在源处等待的所有消息,并保持正确的顺序,
  • 重新连接后到达的消息在转发之前等待旧消息转发。

【问题讨论】:

    标签: activemq jms-topic message-forwarding


    【解决方案1】:

    从主题转发消息似乎是一个糟糕的设计选择。根据ActiveMQ documentation:

    只有在代理收到消息时具有活动订阅的订阅者才能获得消息的副本。

    目标代理充当转发消息的源主题的订阅者。因此,当消息在没有订阅者(目标断开连接)的情况下到达源主题时,任何人都无法使用它们。

    作为解决方案,我更改了设计:

    • 删除目标代理中的虚拟目标配置
    • 在源代理中添加相同的虚拟目标配置(因此现在消息在此处分配到各自的队列中)
    • 将networkConnector 规则添加到源代理,以将这些队列中的消息转发到目标代理上的相应队列。

    现在由于源端的消息在队列中,它们将按照接收顺序被使用,并且不会丢失任何消息,即使代理彼此断开连接也是如此。

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 2011-03-15
      • 2013-03-10
      • 2021-12-05
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多