【发布时间】:2018-12-08 02:56:07
【问题描述】:
我有以下设置:
- 一个集群中的四个 MQ 队列管理器(
QM1(完整存储库)、QM2(完整存储库)、QM3(部分存储库)、QM4(部分存储库)) - 所有集群发送方/接收方通道具有相同的等级和优先级
- 每个队列管理器都有一个非集群别名队列 (
ALIAS.TO.CLQ) -
ALIAS.TO.CLQ有一个基础对象ALIAS.TO.FLOW,它是一个集群别名队列 -
ALIAS.TO.FLOW有一个基础对象L.TO.FLOW,它是一个本地队列。 - 四个队列管理器中的每一个都配置为
CLWLUSEQ(ANY)。 - 集群别名队列有一个
DEFBIND或NOT FIXED。消息是由 IIB(MQ 输出节点)编写的,我相信它尊重这一点 - 尽管我也看到使用 MQ Explorer 或 RFHUtil 的相同行为。 - 消息由 MQ 输出节点放置而不指定队列管理器名称
- 四个集群别名队列中的每一个都有不同的
CLWLPRTY,但相同的CLWLRANK。
此配置的目的是强制消息由同一个本地队列接收,无论消息最初放入哪个队列管理器。如果该队列管理器不可用,则应使用第二高优先级,等等。
我发现的问题是,对于四个队列管理器中的三个,CLWLPRTY 正在被兑现,并且消息被路由到最高优先级的队列管理器。但是,在具有最高优先级的队列管理器本身上,消息被路由到第二高优先级;而不是在同一个队列管理器上使用队列,该队列管理器具有最高优先级。
如果我更改具有第二高优先级的队列管理器,消息总是从具有最高优先级的队列管理器路由到那里 - 所以这不仅仅是巧合。如果两个队列实例共享最高优先级,它永远不会选择与自己在同一个队列管理器上的那个;它似乎总是更喜欢去集群。
这里发生了什么,无论消息放在哪里,我怎样才能让它始终尊重优先级?我查看了 IBM 文档 (https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.ref.con.doc/q082390_.html) 中的“集群工作负载管理算法”页面,但看不出哪里出错了。
--更新--
我尝试创建一组新的队列,格式相同,但只在一个集群队列管理器上 - 所以,ALIAS.TEST -> AL.TEST(集群但只存在一个实例) -> @987654340 @。当我输入ALIAS.TEST 时,我收到一条错误消息:
已发出 MQOPEN 或 MQPUT1 调用,将别名队列指定为目标,但别名队列定义中的 BaseObjectName 解析为不是本地队列或远程队列的本地定义的队列。 (AMQ4480) 已发出 MQOPEN 或 MQPUT1 调用,将别名队列指定为目标,但别名队列定义中的 BaseObjectName 解析为不是本地队列或远程队列的本地定义的队列。 (AMQ4480)
严重性:20(错误)
响应:更正队列定义。
但我可以毫无问题地加入AL.TEST 队列。
--编辑--
好的,它发生的原因出现在这里:https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.pro.doc/q003120_.html
一个别名不能直接解析为同一个队列管理器上的另一个别名。
那么我怎样才能得到我想要的行为呢?
【问题讨论】:
-
是的,我想过。在那种情况下,GET 会发生什么? IIB 总是从队列的本地实例读取,还是从最高集群优先级读取?
-
感谢@JoshMc,这似乎有效。如果你把它写成答案,我会这样标记。
-
没问题。查看我在回答中提到的 KC 页面,因为在某些情况下,即使所有队列管理器都已启动并且所有队列都是
PUT(ENABLED),它仍可能转到另一个优先级较低的队列。特别是如果到 QM2-4 的通道处于 RUNNING 状态但到 QM1 的通道是STARTING。如果在 QM1 的通道处于STARTING状态时放置消息,它们将转到 QM2。
标签: ibm-mq