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

时间:2015-11-03 13:29:11

标签: java deployment architecture jms hornetq

这是我们设置的简化/示意拓扑

   [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。

这里的问题是什么?拓扑是否适合我们的需求?

1 个答案:

答案 0 :(得分:0)

Answer from jboss hornetq support forum(créditsJustinBertram):

  

我确信你知道,队列有先进先出(即FIFO)   语义。分组的消息基本上就像是一个瓶颈   队列,因为他们确保串行消息处理。这是一个简单的   例子......

     

考虑包含两条消息的组A,B和C.   每个队列中共有6条消息。还要考虑一下   按顺序排列A,A,B,B,C,C。现在考虑3个不同的消费者   每个消费不同的群体。 A组的消费者会   接收第一条消息,处理它,然后确认它   从队列中删除。然后它会收到第二条消息,   处理它,并确认它以便从队列中删除它。   在A组的消费者忙于这两条消息的过程中   队列中不能消耗其他消息。只有当   确认第二条消息实际上可以是B组的消费者   收到B组中的第一条消息。一旦消费者为B组   承认C组的消费者最终可以传达它的两个消息   接收其组中的消息。此行为受...的约束   队列的FIFO语义。 B组中的消息不能跳跃   组A中的消息,并在所有消息之前消耗   A组被消耗。 C组中的消息也是如此。

     

由于您的所有邮件都在一个组中,我绝不会期待   交付计数超过1。