我有一个模块,它在JVM
(无容器)中独立运行,并通过JMS
与其他模块通信。
我的模块既是一个队列中的生产者,又是另一个队列中的消费者。
然后我需要集群这个模块,既出于HA的原因又出于工作负载的原因,我可能会选择使用Terracotta + Hibernate来集群我的实体。
目前,当我的应用程序启动时,它会启动一个用作消费者的线程(通过Executors.newSingleThreadExecutor()
)(如果相关且必要,我可以附加实际代码示例)。
我在阅读问题时理解的是,如果我只是在N
JVMs
上启动我的模块,那么N
将创建和队列中的每条消息都将到达N
个订阅者。
我想做的只是其中一个(让我们当前说哪个不重要)处理该消息,因此实际上使我能够一次处理N
个消息。
如何/应该如何做?我离开赛道了吗?
BTW,我使用OpenMQ
作为我的实现,但我不知道这是否相关。
感谢您的帮助
答案 0 :(得分:1)
群集环境中的消息处理的典型案例。这就是我要做的。
使用广播消息(基于频道)代替队列。队列对点对点通信有用并不是很有效。设置消息的有效性,直到其中一个消费者消耗它为止。这样,其他消费者甚至看不到消息,只有一个消费者会消费它。
答案 1 :(得分:0)
看看JGroups。您可以考虑实现模块/订阅者以使用jgroup来进行所需的同步。 JGroups提供可靠的多播通信。