【问题标题】:Websphere Application Server cluster and JMS message consumptionWebsphere Application Server 集群和 JMS 消息消费
【发布时间】:2012-02-01 10:00:42
【问题描述】:
我们正在开发一个将部署到 WAS 集群的应用程序。该应用程序使用来自多个 JMS (Websphere MQ) 队列的消息并将结果写入单个数据库。
但是,我们有一个要求,即在应用程序深处,一次处理给定 ID 的所有消息。我们目前使用同步集合强制执行此操作,但这在集群中不起作用。
那么有没有办法配置应用程序/集群/激活规范来实现这一点?
【问题讨论】:
标签:
jms
websphere
ibm-mq
cluster-computing
【解决方案1】:
首先要意识到,应用程序必须设计为消除消息关联性,以便水平扩展。为了克服应用程序的设计约束,可以预期消息传输的工作量是有限的。根据消息有效负载内容改变消息传递路径、顺序或目的地的处理是 ESB 而不是传输的工作。最佳解决方案是使用适合水平扩展的架构重新设计应用程序。
也就是说,一种方法是使用消息组。寻找新组的应用程序实例应忽略JMSXGroupID 不是1 的任何消息。发送消息的应用程序必须准备相应地设置组 ID 和序列号。
实现此目的的另一种方法是拦截和调度。程序读取主队列以查找 ID 的新实例。当它看到一个新的 ID 时,它会将该消息移动到一个单独的调度队列中。消费应用程序实例都读取调度队列寻找工作。由于此队列中的 ID 保证是唯一的,因此每个 Id 都分配给特定的应用程序实例。然后,应用程序使用选择器打开主队列以获取要处理的 ID。生产者应用程序必须将 ID 设置为消息属性或在 Correlation ID 字段中才能进行选择,但它们不需要管理组。
【解决方案2】:
我可以告诉你,你和之前的回复者都比我了解更多,但以防万一这有帮助......
我们有一个 MDB,我们希望在整个集群中一次只处理一个请求,因此我们将激活规范中的“最大并发端点”设置为 1。
所以也许您可以为这个特定的 ID 使用不同的目的地,或者让初始目的地的逻辑将 ID 重新排队到第二个目的地?