Jms 当多个MessageConsumer连接到同一队列(Websphere MQ)时,如何平衡消息使用者的负载?

Jms 当多个MessageConsumer连接到同一队列(Websphere MQ)时,如何平衡消息使用者的负载?,jms,websphere,load-balancing,ibm-mq,Jms,Websphere,Load Balancing,Ibm Mq,我使用的是WebSphere MQ 7,我有两个客户端连接到同一个QMgr并使用来自同一队列的消息,如下代码所示: while (true) { TextMessage message = (TextMessage) consumer.receive(1000); if (message != null) { System.out.println("*********************" + message.getText());

我使用的是WebSphere MQ 7,我有两个客户端连接到同一个QMgr并使用来自同一队列的消息,如下代码所示:

 while (true) {
        TextMessage message = (TextMessage) consumer.receive(1000);
        if (message != null) {
            System.out.println("*********************" + message.getText());
        }
    }

我发现只有一个客户端总是检索消息。是否有任何方法可以让两个客户端使用消息负载平衡?MQ服务器端有任何配置选项吗?

您的客户端做的不多,因此一个实例可能可以处理全部负载。尝试实现更现实的工作负载,或者更简单地在客户端中放置Thread.sleep。

在管理队列句柄时,WMQ将它们放置在堆栈中比LIFO队列快得多。因此,如果消息到达队列的速度慢于处理它们所需的速度,则实例可能会处理消息并执行另一个GET,WMQ会将该GET向下推到堆栈上。结果是,在低容量用例中,只有一个实例会看到消息

在有许多实例等待消息的较大环境中,活动可能会在这些实例中的一部分之间进行循环,而其他实例则缺少消息。例如,当队列上有10个getter时,您可能会看到3条正在处理的消息和7条空闲消息

虽然这对于MQ来说要快得多,但对于不知道它在内部如何工作的客户来说,这是一种困惑,因此他们打开PMR询问这个确切的问题。IBM必须在几种备选方案中进行选择:

  • 添加多个代码路径以在完全加载时按堆栈管理性能,而在轻加载时按后进先出管理以实现明显的平衡。这增加了代码,添加了许多新的决策点以引入错误,并解决了一个与感知有关的问题,而不是可靠性或性能问题
  • 教育客户了解其工作原理。当然,一旦你记录了它,你就不能改变它。我发现这一点的方式是参加IMPACT的“WMQ内部”演示。它不在信息中心中,因此IBM可以对其进行更改,但它可供客户使用
  • 什么也不做。虽然从代码设计的角度来看,这是最好的结果,但这种行为是违反直觉的。用户需要理解为什么事情没有按预期进行,并且会浪费时间试图找到导致所需行为的配置,或者打开PMR
我不确定它是否仍能以这种方式工作,但我希望它能做到。我测试它的方法是一次将许多消息放到队列中,然后查看它们是如何分布的。如果您在一个工作单元中将大约50条消息放到队列中,那么您应该会看到两个实例之间的分布更好

如何一次在队列中放置50条消息?首先,在应用程序关闭或备用队列中生成它们。如果在目标队列中生成了它们,请使用将它们移动到备用队列。现在启动应用程序,并确保队列的
IPPROC
计数等于您启动的应用程序的实例数。再次使用Q,在单个工作单元中将所有消息复制到原始队列。由于它们同时在队列中可用,您的两个应用程序实例都应该立即被传递一条消息。如果使用“复制”而不是“移动”,则可以根据需要重复此操作