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

JMS拓扑(具有多个消费者的队列)和消息组

邹慈
2023-03-14

下面是我们设置的简化/示意图拓扑

   [Front server 1 (message producer)]  [Front server n (message producer)]
                   |                                    |        
                   |________________    ________________| 
                                    |  |         
                         [Messaging Server (HornetQ)]
                                    |  |
                    ________________|  |________________
                    |                                   |
   [Task server 1 (Message Driven Bean)]          [Task server n (MDB)]  
  • 每个节点(服务器)都是一个独立的(无集群)jboss应用服务器(Jboss-as7),包括消息传递服务器。
  • 消息传递服务器部署许多JMS队列。
  • 每个任务服务器为每个队列部署一个MDB,每个队列有许多使用者。
  • 所有消息生产者使用相同的入站适配器,所有消息使用者使用相同的出站适配器。事实上,所有前端节点都是完全相同的(与所有服务器节点相同,配置相同,部署的工件相同)。

现在我的问题来了:

message.setStringProperty("JMSXGroupID", tenantName);

这里有什么问题?拓扑结构是否适合我们的需要?

共有1个答案

杜阳炎
2023-03-14

来自jboss hornetq支持论坛的回答(Crédits Justin Bertram):

您一定知道,队列具有先进先出(即FIFO)语义。分组消息基本上就像队列上的瓶颈一样,因为它们确保了串行消息处理。这里有一个简单的例子...

考虑组A、B和C,每组包含两条消息,队列中总共有6条消息。同时考虑它们的顺序是A、A、B、B、C、C。现在考虑3个不同的消费者,每个消费者消费不同的群体。组A的使用者将接收第一条消息,处理它,并确认它,以便将它从队列中删除。然后,它将接收第二条消息,处理它,并确认它,以便将其从队列中移除。在组A的使用者忙于处理这2条消息期间,队列中不能使用其他消息。只有当第二个消息被确认时,组B的消费者才能实际接收组B中的第一个消息。一旦组B的消费者确认了其两个消息,组C的消费者才能最终接收其组中的消息。此行为由队列的FIFO语义控制。组B中的消息不能跳过组A中的消息并在组A中的所有消息被消费之前被消费。C组中的消息也是如此。

 类似资料:
  • 我有一个由第三方发布的JMS队列。我想在不同的机器上设置多个使用者,只有一台特定机器的使用者确认该队列上的消息。简而言之,如果特定机器的使用者没有接收到消息,那么该消息不应从队列中删除。这是可以实现的吗?

  • 我们运行一个集群工作线程应用程序,该应用程序依赖于 Kafka 使用高级消费者 API 使用消息。群集中的所有节点共享同一个使用者组。现在我们想要的是将该逻辑的一部分迁移到 Kafka 流处理器 API。这里的方法是什么?如果分配了相同的 groupId/clientId,流拓扑是否会与现有使用者就消息进行斗争?我们应该分配不同的 groupId/clientId 吗?流式传输拓扑?说“组”。 “

  • 问题内容: 我有一个JMS客户端,它正在生成消息并通过JMS队列发送到其唯一的使用者。 我想要的是不止一个消费者收到这些消息。我想到的第一件事是将队列转换为主题,以便现有用户和新用户都可以订阅并将相同的消息传递给他们。 显然,这将涉及在生产者和消费者方面修改当前的客户代码。 我还要查看其他选项,例如创建第二个队列,这样就不必修改现有的使用者。我相信这种方法有很多优点,例如(如果我错了,请纠正我)在

  • 我正在研究一个示例,其中JMS队列托管在JBoss EAP 6实例上(一个用于请求,另一个用于响应)。我还有一个在Weblogic托管服务器上运行的应用程序。 我想设置一种机制,允许运行在Weblogic上的应用程序能够使用添加到JBoss上的请求队列上的消息。此外,应用程序应该能够将消息发布到请求队列(也托管在JBoss上) 我在Oracle文档中读到了关于外国JNDI提供程序的信息,我找到的大

  • 我运行生产者,它生成N条消息,我在仪表板上看到它们。当我运行接收器时,它会接收来自队列的所有消息,并且队列为空。 我需要有多个生产者生成消息到同一个队列。多个客户从队列中接收消息。消息将被队列TTL删除。但是现在第一个接收者从队列中获取所有消息。我怎么能做到这一点?

  • 问题内容: 我有一个带有HornetQ的JBoss-6服务器和一个队列: 有一个不同的消费者(在不同的机器)连接到这个队列中,但只有一个 单一的 消费者是活动的时间。如果我关闭此使用者,则消息将立即由其他使用者之一处理。 由于我的消息需要一些耗时的处理,因此我希望多个使用者同时处理其唯一消息。 我记得在早期版本的JBoss中也有类似的情况,该设置可以正常工作。在Jboss-6中,消息传递系统运行良