这是我们设置的简化/示意拓扑
[Front server 1 (message producer)] [Front server n (message producer)]
| |
|________________ ________________|
| |
[Messaging Server (HornetQ)]
| |
________________| |________________
| |
[Task server 1 (Message Driven Bean)] [Task server n (MDB)]
现在这是我的问题:
应用程序是多租户应用程序,对于给定的队列,某些任务(消息处理)不能为给定的租户并行处理,我们设置message grouping来处理此约束。消息组是租户名称,由消息生产者在发送消息时设置:
message.setStringProperty("JMSXGroupID", tenantName);
在一个平台上,我们拥有1000多个租户(1000多个不同的消息组),每个服务器和3个任务服务器的给定队列3个消费者。
在消息传递服务器上监视此队列时,我们可以看到队列中有数千条消息和9个消费者。我们希望9到9传递消息,但实际上传递消息的数量不会超过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。