【问题标题】:Module clustering and JMS模块集群和 JMS
【发布时间】:2010-08-17 10:13:46
【问题描述】:

我有一个模块在JVM(无容器)中独立运行,并通过JMS 与其他模块通信。 我的模块既是一个队列中的生产者,又是另一个队列中的消费者。 然后,出于 HA 原因和工作负载原因,我需要对这个模块进行集群,并且我可能会使用 Terracotta+Hibernate 来集群我的实体。 目前,当我的应用程序启动时,它会启动一个线程(通过Executors.newSingleThreadExecutor())作为消费者(如果相关和必要,我可以附加实际的代码示例)。

我从这里阅读的问题中了解到,如果我只是在 N 不同的 JVMs 上启动我的模块,那么 N 将创建不同的订阅者并且队列中的每条消息都会到达N订阅者。 我想做的是只让其中一个(让我们目前说哪个不重要)处理该消息,因此实际上使我能够一次处理 N 消息。

如何/应该如何做到这一点?我是不是偏离轨道了?

顺便说一句,我使用 OpenMQ 作为我的实现,但我不知道这是否相关。

感谢您的帮助

【问题讨论】:

    标签: java jms cluster-computing publish-subscribe


    【解决方案1】:

    集群环境中消息处理的经典案例。这就是我会做的。

    使用广播消息(基于频道)代替队列。队列对于点对点通信很有用并不是很有效。设置消息的有效性,直到它被消费者之一消费。这样,其他消费者甚至不会看到消息,只有一个消费者会消费它。

    【讨论】:

    • 您好 Tushar,感谢您的帮助。 Broadcast message 是什么?它是在 JMS 队列上发送的另一种消息吗?还有你的意思是什么:“队列对点对点通信很有用不是很有效”?谢谢
    • 我的意思是使用基于主题的通信代替基于队列的通信,在这种通信中,您必须在传递消息时指定目的地,或者必须实现某种路由器逻辑将消息路由到基于特定标准的特定消费者。
    • 嗨 Tushar,我读了一些关于主题与队列的文章,您的解决方案听起来很棒。我唯一不明白的是关于“设置消息的有效性......”为什么我需要设置它的有效性?根据主题机制的定义,它不会被一个消费者消费吗?伊泰
    【解决方案2】:

    看看JGroups。您可以考虑实现您的模块/订阅者以使用 jgroups 进行所需的同步。 JGroups 提供可靠的多播通信。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2011-08-03
      • 2011-08-23
      • 2011-08-22
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多