当前位置: 首页 > 知识库问答 >
问题:

跨多个队列的ActiveMQ消息组使用者选择?

施凡
2023-03-14

ActiveMQ消息组是跨多个使用者进行负载平衡的一个非常好的特性。简而言之:消息流根据消息中嵌入的组标识符(JMSXGroupID)在单个队列的多个使用者之间进行分区。(因此,使用者1将获得jmsxgroupid=A的所有消息,使用者2将获得jmsxgroupid=B的所有消息,依此类推)

现在,假设您有两个队列:aB,并假设在流经这两个队列的消息中使用一致的JMSXGroupIDS分类法。代理为jmsxgroupid=abcon queueA选择的使用者是否与代理为jmsxgroupid=abcon queueB选择的连接相同?

但是,我们能模拟这种行为吗?例如,复合目的地上的使用者可能是一个可行的解决方案--确保aB上的所有使用者都在复合目的地上使用a、B并且您可能正在进行业务--但是ActiveMQ似乎不支持从复合目的地使用。

我找到的唯一解决方案是简单地将AB的消息推送到一个队列上--将其称为AB--并在该队列上拥有一个专用使用者。您现在必须区分“A消息”和“B消息”,但是您可以轻松地使用标题来区分。

然而,这个解决方案闻起来很滑稽。(您现在必须假设生产者会尽职尽责地为他们的消息应用特殊的头,或者修改您的有效负载。)是否有一种解决方案可以确保使用者跨越两个单独的队列aB总是登陆在同一个连接上?

共有1个答案

羊舌洛华
2023-03-14

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

通常,当您使用消息组时,您试图确保消息的顺序不仅是传递,而且是处理--也就是说,特定实体的所有事件都是按顺序处理的。魔鬼总是在您的用例的细节中,但是将所有相关的消息放在一个队列中会给您带来您想要的结果。为了以不同的方式处理它们,您需要将某种多路复用逻辑放入客户机中,以便根据消息负载做出决定--您所说的众所周知的头是解决方案的一个很好的候选方案。

为了绕过确保客户机显式设置此选项的前提条件,您可以编写一段Camel路由逻辑来代表您执行此选项--只有添加到ActiveMQ5.9中的Broker:组件才能做到这一点。这个想法将是生产者看到两个独立的队列--A和B;当消息被放入时,路由逻辑将从这些队列中读取,适当地设置头部,并将它们重新路由到C。路由逻辑实际上是作为拦截器工作的。

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

然后可以在复用逻辑中使用OriginalMessageSource标头。

 类似资料:
  • 我们最近遇到了由RabbitMQ支持的应用程序的意外行为。RabbitMQ版本为3.6.12,我们使用的是.NET客户端5.0.1 应用程序订阅了两个队列,一个用于命令,另一个用于事件--我们还使用手动确认。我们的应用程序配置为有7个消费者。每个通道都有自己的通道(IModel),每个通道都有自己的EventingBasicConsumer,当EventingBasicConsumer.Recei

  • 我使用Spring JMS和ActiveMQ,其中有一个客户机将消息推送到队列,有多个使用者线程监听并从队列中删除消息。有些时候,相同的消息会被两个使用者从队列中出列。我不希望这种行为,并希望确保仅有的一条消息由一个消费者线程处理。你知道我哪里出了问题吗? ActiveMQ 5.9.1配置:

  • ActiveMQ:5.10.2在ServiceMix的Karaf OSGi中 卡哈布坚持。 默认代理设置。连接中的默认设置(TCP://x.x.x.x.x:61616) 一切正常,但是:如果我将消费者的数量减少到1(或者2或3个,我不知道阈值在哪里),那么来自1个队列的消息将被消耗,来自另一个队列的消息将被存储。过了一段时间,我看到了这张照片: 1用户停止接收消息。他认为没有更多消息了。 从act

  • 我刚刚开始使用RabbitMQ和AMQP。 我有一个消息队列 我有多个消费者,我想用相同的消息做不同的事情。 RabbitMQ的大部分文档似乎都集中在循环(round-robin)上,即单个消息由单个消费者使用,负载在每个消费者之间分散。这的确是我目击的行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这里有一个消费者: 如果我启动消费者两次,我可以看到每个消费者都在以循环行为消费交替消息。

  • 下面是我们设置的简化/示意图拓扑 每个节点(服务器)都是一个独立的(无集群)jboss应用服务器(Jboss-as7),包括消息传递服务器。 消息传递服务器部署许多JMS队列。 每个任务服务器为每个队列部署一个MDB,每个队列有许多使用者。 所有消息生产者使用相同的入站适配器,所有消息使用者使用相同的出站适配器。事实上,所有前端节点都是完全相同的(与所有服务器节点相同,配置相同,部署的工件相同)。

  • 我们使用activemq作为Java独立应用程序的消息队列。我的问题是,基于activemq web控制台,队列有一定数量的消息排队和出列。但是,根据我在代码中添加的sysout语句,应用程序消耗的消息数似乎少于activemq web控制台上显示的消息数。例如,在activemq控制台上,没有。排队和出列的消息约为1800条。但是,在控制台上显示的出列消息数(我每接收一条消息就增加一个计数器)只