0

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

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

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

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

1 回答 1

0

看起来从主题转发消息是一个糟糕的设计选择。根据ActiveMQ 文档

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

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

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

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

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

于 2015-08-07T01:12:20.167 回答