2015-11-03 58 views
0

这里是我们建立JMS拓扑结构(排队多个消费者)和消息分组

[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。
  • 所有消息生产者使用相同的入站适配器,所有消息使用者(MDB)都是相同的出站适配器。实际上,所有前端节点完全相同(相同的AS,相同的配置,相同的部署工件),对于所有服务器节点都是相同的。

现在,这里是我的问题:

的应用程序是一个多租户之一,对于给定的队列中,一些任务(信息处理)不能在一个给定的租户并行处理,我们成立所以message grouping来处理这个约束。消息组是承租人名,由消息生产者发送消息时设置:

message.setStringProperty("JMSXGroupID", tenantName); 

在一个平台上,我们有1000多个租户(所以1000+不同的消息组),并对于给定的队列3名消费者每服务器和3个任务服务器。

当在消息服务器上监视此队列时,我们可以在队列和9个消费者中看到数千条消息。我们期望消息能够按9递9递送,但实际上递送消息计数不会超过1.

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

+0

能否请您详细说明9 * 9和计从未超过1 –

回答

0

Answer from jboss hornetq support forum(学分贾斯汀·伯特伦):

正如我敢肯定,你知道,一个队列有先入先出(FIFO即) 语义。由于分组消息确保串行消息处理,因此分组消息基本上在队列中起瓶颈作用。下面是一个简单的 示例...

考虑包含两条消息的组A,B和C,每条消息对于队列中总共6条消息。还要考虑他们 是在A,A,B,B,C,C的顺序。现在考虑3个不同的消费者 每个消费不同的组。 A组的用户将收到第一条消息,处理它并确认,以便 从队列中删除。然后它会收到第二条消息, 处理它,并确认它,以便将其从队列中删除。 在组A的使用者忙于使用这两条消息 期间,不能从队列中消耗其他消息。只有在 第二条消息被确认时,组B的消费者实际上 才会收到组B中的第一条消息。一旦组B的消费者确认其两条消息,组C的消费者最终可以接收其组中的消息。此行为受队列的FIFO语义支配。 B组中的消息不能跳过组A中的消息 ,并且在使用组A中的所有消息 之前消耗。这同样适用于组消息C.

因为所有消息都是一群在我绝不会想到 在交付数量将超过1

相关问题