【问题标题】:Message Order in Apache ActiveMQ Artemis ClusterApache ActiveMQ Artemis 集群中的消息顺序
【发布时间】:2021-02-15 05:32:44
【问题描述】:

我正在尝试在 Apache Artemis 集群中实现消息排序。连接到集群的生产者/消费者实现高可用性。因此,在某个时间点,将有两个相同应用程序实例连接到主题或队列。到目前为止,我可以找到以下两种方法可以用来在 Red Hat AMQ / Artemis 集群中实现排序:

  1. 消息组(根据文档,仅当集群中每个节点有一个消费者时才可靠)
  2. 独占队列(消息顺序仅保留在单个节点上)。

我完全理解使用集群和期望消息排序是相互冲突的要求,但由于消费者无法处理处理乱序消息的复杂性,它仍然需要在我正在处理的项目中实现。

在 Artemis ActiveMQ / Red Hat AMQ 集群中可以使用哪些替代方案来实现消息排序?

【问题讨论】:

  • 您能否详细说明为什么需要集群和有序消息传递?
  • 我们正在使用由 polygot 团队使用的企业级集群。即使我们只能在集群中使用 1 个主/从对,它仍然不是高度可用的,因为它不是跨数据中心产生的。简而言之,我们无法控制拓扑。一些应用程序能够在消费者端处理乱序消息,而另一些则不能。此外,消费者应用程序具有 Active/Active 配置的高可用性部署,因此多个消费者开始在源头消费扰乱消息的顺序。

标签: redhat activemq-artemis amq


【解决方案1】:

在集群环境中,一个独占消费者与每个代理上的每个队列相关联,因此根据消息负载平衡配置,每个代理可以有一个消费者接收消息。这会破坏排序。您的生产者和消费者需要在同一个代理实例上才能保持顺序。

正如您所说,集群消息组功能并不可靠,但它在某些非常具体的用例中可能很有用。另请注意,对于 HA,拥有代理集群是不够的。您需要显式配置 HA(共享存储或复制),否则,如果代理永久失败,则其所有消息都将丢失。

【讨论】:

  • 我根据文档尝试了这个示例,如果我们在 2 个节点的集群中配置了独占队列。一个消费者 C1 连接到节点 1 上的这个独占队列,另一个消费者 C2 连接到节点 2 上的同一个独占队列。假设生产者发送了 2 条消息。第一条消息到达 C1(这个消费者需要很长时间才能确认)。同时消费者C2收到第二条消息,所以最终的结果是消息的顺序没有保证。我们该如何解决这个问题?
  • 正如我所说,不要使用 clustered 组并将您的客户端配置为始终连接到同一个集群代理。这样,您就可以使用可靠且性能更好的 本地 组。
  • 我上面提到的这个例子是关于排他队列而不是集群组如果错了请纠正我?
  • 更新了我的答案,添加了您的测试用例。
猜你喜欢
  • 1970-01-01
  • 2016-06-23
  • 2018-05-08
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2019-04-02
相关资源
最近更新 更多