gpt4 book ai didi

java - ActiveMQ 消息组消费者跨多个队列选择?

转载 作者:行者123 更新时间:2023-12-01 13:39:52 25 4
gpt4 key购买 nike

ActiveMQ Message Groups是跨多个消费者进行负载平衡的一个美妙功能。简而言之:根据消息中嵌入的组标识符 (JMSXGroupID),消息流在单个队列的多个使用者之间进行分区。 (因此,消费者 1 将获取所有带有 JMSXGroupID = a 的消息,消费者 2 将获取所有带有 JMSXGroupID = b 的消息,依此类推。)

现在,假设您有 2 个队列:AB,并假设在消息流中使用一致的 JMSXGroupID 分类法通过两个队列。代理为队列 A 上的 JMSXGroupID = ABC 选择的使用者是否是来自代理为 JMSXGroupID = ABC 选择的同一连接的使用者队列B

我怀疑我所问的问题的答案是否定的。涉及的变量太多:如果代理为 A 选择的消费者没有为 B 选择相应的消费者,会发生什么情况?如果代理为 A 选择的消费者有B多个对应消费者,会发生什么情况?在这些情况下没有明显的正确答案。

但是,我们可以模拟这种行为吗?例如,composite destination 上的消费者可能是一个可行的解决方案 - 确保 AB 上的所有消费者都在复合目的地 A,B 上消费,并且您可能会开展业务-- 但 ActiveMQ 似乎不支持从复合目标进行消费。

我找到的唯一解决方案就是将 AB 的消息推送到一个队列上 - 称之为 AB ——并拥有独家消费者。您现在必须区分“A 消息”和“B 消息”,但您可以使用 header 轻松做到这一点。

但是,这个解决方案听起来很奇怪。 (您现在必须假设生产者将尽职尽责地将特殊 header 应用于其消息,或修改您的有效负载。)是否有一种解决方案可以确保消费者跨越两个单独的队列AB 总是登陆同一个连接?

最佳答案

正如您所计算的,消息组仅适用于单个队列。多个队列之间没有协调。

通常,当您使用消息组时,您不仅要保证传递的消息顺序,还要保证处理的顺序——也就是说,特定实体的所有事件都会按顺序处理。问题始终存在于用例的细节中,但是将所有相关消息放入单个队列将为您提供所需的结果。为了以不同的方式处理它们,您需要将某种多路复用逻辑放入您的消费者中,以根据消息负载做出决定 - 正如您所说,众所周知的 header 是解决方案的良好候选者。

为了绕过确保客户端显式设置此设置的先决条件,您可以做的是编写一段 Camel 路由逻辑来代表您执行此操作 - 这只能通过 broker: component 来实现。这是添加到 ActiveMQ 5.9 中的。这个想法是生产者看到两个独立的队列 - A 和 B;当消息被放入时,路由逻辑将从这些队列中读取数据,适本地设置 header ,然后将它们重新路由到 C。路由逻辑实际上充当拦截器。

<route id="ConflateA">
<from uri="broker:queue:A"/>
<setHeader headerName="OriginalMessageSource">
<constant>A</constant>
</setHeader>
<to uri="broker:queue:C"/>
</route>

然后,您可以在多路复用逻辑中使用 OriginalMessageSource header 。

关于java - ActiveMQ 消息组消费者跨多个队列选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com