【问题标题】:Websphere MQ Cluster Workload Balancing: messages going to dead letter queueWebsphere MQ 集群工作负载平衡:消息进入死信队列
【发布时间】:2018-07-10 00:20:30
【问题描述】:

我创建了一个带有 3 个 QMgrs 的 WMQ 集群。 2 个完整存储库和 1 个部分存储库。这是使用的mqsc

crtmqm GW
strmqm GW
runmqsc GW
alter qmgr deadq('SYSTEM.DEAD.LETTER.QUEUE')
define listener(gw.listener) trptype(TCP) port(1416) ipaddr(xx.xx.xx.xx)
start listener(gw.listener)
define channel(SYSTEM.ADMIN.SVRCONN) chltype(svrconn)
ALTER QMGR CHLAUTH(DISABLED)
end

runmqsc QM01
alter qmgr repos('DEVELOPMENT.CLUSTER')
end

runmqsc QM02
alter qmgr repos('DEVELOPMENT.CLUSTER')
end

runmqsc QM01
define chl(to.QM01) chltype(clusrcvr) trptype(tcp) +
       conname('xx.xx.xx.xx(1414)') cluster(DEVELOPMENT.CLUSTER) 
end

runmqsc QM02
define chl(to.QM02) chltype(clusrcvr) trptype(tcp) +
       conname('xx.xx.xx.xx(1415)') cluster(DEVELOPMENT.CLUSTER) 
end

runmqsc GW
define chl(to.GW) chltype(clusrcvr) trptype(tcp) +
       conname('xx.xx.xx.xx(1416)') cluster(DEVELOPMENT.CLUSTER) 
end

runmqsc QM01
DEFINE CHANNEL(TO.QM02) CHLTYPE(CLUSSDR) TRPTYPE(TCP) +
       CONNAME('xx.xx.xx.xx(1415)') CLUSTER(DEVELOPMENT.CLUSTER)
end

runmqsc QM02
DEFINE CHANNEL(TO.QM01) CHLTYPE(CLUSSDR) TRPTYPE(TCP) +
       CONNAME('xx.xx.xx.xx(1414)') CLUSTER(DEVELOPMENT.CLUSTER)
end

runmqsc GW
DEFINE CHANNEL(TO.QM01) CHLTYPE(CLUSSDR) TRPTYPE(TCP) +
       CONNAME('xx.xx.xx.xx(1414)') CLUSTER(DEVELOPMENT.CLUSTER)
DEFINE CHANNEL(TO.QM02) CHLTYPE(CLUSSDR) TRPTYPE(TCP) +
       CONNAME('xx.xx.xx.xx(1415)') CLUSTER(DEVELOPMENT.CLUSTER)
end

runmqsc QM02
define qlocal('BACKUP') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('PROVIDER') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('RESPONSE') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('STORE') CLUSTER(DEVELOPMENT.CLUSTER)
REFRESH CLUSTER(DEVELOPMENT.CLUSTER) REPOS(YES) 
end

runmqsc QM01
define qlocal('BACKUP') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('PROVIDER') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('RESPONSE') CLUSTER(DEVELOPMENT.CLUSTER)
define qlocal('STORE') CLUSTER(DEVELOPMENT.CLUSTER)
REFRESH CLUSTER(DEVELOPMENT.CLUSTER) REPOS(YES)
end

现在我正在向队列 @9​​87654324@ 上的 QMgr GW 发送消息。请注意GW 不托管此队列。它由QM01QM02 主持

amqsput PROVIDER GW

遗憾的是,所有消息都将进入 QMgr GW 的死信队列。

请帮助解决此问题。任何有关调试的建议都会有很大帮助。

【问题讨论】:

    标签: ibm-mq


    【解决方案1】:

    这里有几个可能的问题。

    通道的定义不同。有些名称混合大小写,有些名称全大写。如果您指望没有引号来确保 QMgr 将它们全部折叠为大写,这可能会起作用。但是,这些命令显然已经过编辑,至少就CONNAME 值而言,所以我不假设结果对象匹配。

    创建集群后,您是否检查所有频道都显示为AUTO-EXPLICIT?这就是您知道集群已正确启动的方式。

    REFRESH CLUSTER 命令也可能导致中断。这在定义新对象时不是必需的,实际上非常具有破坏性。它等待通道重新启动,并且在您运行命令的时间点,通告新对象的命令已发送到存储库但未返回。 REFRESH CLUSTER 然后请求通道停止,可能在批处理中,排队命令集群删除它刚刚收到但尚未回复的信息,然后向集群发送新命令,通告它刚刚收到的对象删除。如果这听起来令人困惑,请考虑一下存储库上的集群命令服务器的感觉。

    从队列定义脚本中删除REFRESH CLUSTER 命令。

    一旦您确定所有通道都已升级到AUTO-EXPLICIT 并删除了REFRESH CLUSTER,您就可以开始实际调试了。在这些情况下,查看死消息的 DLQ 标头以找出列出的原因代码确实很有帮助。这通常提供了足够的信息来发现问题。您还可以启用各种 QMgr 诊断事件并使用其中一种事件查看工具查看它们,或者查看通道任一端的 QMgr 上的错误日志。


    接下来的这些建议与您的诊断无关,除了使用最佳实践构建的 QMgr 通常更不容易出错且更易于调试。下面是一些主动提供的 MQ 集群最佳实践建议。

    • 放弃TO.[QMGR] 频道名称!请改用[cluster].[qmgr] 名称,例如DEVCLUS.QM01。这可确保您始终拥有专用于每个集群的通道,即使您有重叠的集群。但是,这确实意味着集群名称中不能包含 .,并且必须小于 10 个字符。
    • 对于不是完整存储库的事物,仅对其中一个存储库定义显式CLUSSDR。如果您拥有两个以上的存储库(例如在迁移期间),集群成员将能够通过这种方式找到它。
    • 始终在定义中使用引号。如果您在让某些东西工作时遇到问题,那么只有一种可能的解释的定义是解决问题的捷径。
    • 在定义新的集群通道时,让通道有时间稳定下来,并验证它是否启动并进入正确的状态。
    • 使用AMQSPUT 打开新定义的远程托管集群队列以进行输出,但实际上不向它们发送消息。确保在打开期间没有出现错误(即队列解析),然后确保集群通道已启动。 然后执行amqsput并发送消息。
    • REFRESH CLUSTER 是用于部分存储库的命令,而RESET CLUSTER 是用于完整存储库的命令。在这种情况下,该命令使用不当并且在错误类型的集群节点上。预计会出现问题。
    • 希望在现实生活中没有托管在完整存储库 QMgrs 上的应用程序队列。您可以为集群做的最好的事情是在专用 QMgrs 上托管完整的存储库 - 即使这些是与应用程序 QMgrs 在同一主机上的额外 QMgrs。将它们分开可确保集群操作流量和应用程序流量永远不会穿过相同的通道。它还可以在应用 QMgrs 之前修补或升级存储库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2013-05-23
      • 2012-11-04
      • 1970-01-01
      • 2017-06-19
      • 2016-04-24
      相关资源
      最近更新 更多