在两个ActiveMQ代理之间转发邮件时维护邮件的顺序

时间:2015-08-05 23:54:06

标签: activemq jms-topic message-forwarding

我有一个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>

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

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

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

1 个答案:

答案 0 :(得分:0)

看起来从主题转发邮件是一个糟糕的设计选择。根据{{​​3}}:

  

只有在经纪人收到消息时拥有有效订阅的订阅者才能获得该消息的副本。

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

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

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

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