代码之家  ›  专栏  ›  技术社区  ›  simonalexander2005

为什么我的集群不尊重CLWLPRTY?

  •  1
  • simonalexander2005  · 技术社区  · 7 年前

    我有以下设置:

    • 群集中的四个MQ队列管理器( QM1 QM2 (全面回购), QM3 QM4 (部分回购)
    • ALIAS.TO.CLQ )
    • 有一个基本对象 ALIAS.TO.FLOW ,这是一个群集别名队列
    • 有一个基本对象 L.TO.FLOW
    • 四个队列管理器中的每一个都配置为 CLWLUSEQ(ANY)
    • 群集别名队列具有 DEFBIND 属于 NOT FIXED . 消息是由IIB(MQ输出节点)编写的,我相信这是值得的——尽管我在使用MQ Explorer或RFHUtil时也看到了同样的行为。
    • 四个群集别名队列中的每一个都有不同的名称 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 L.TEST . 当我把 别名测试 ,我收到一条错误消息:

    已发出MQOPEN或MQPUT1调用,将别名队列指定为目标,但别名队列定义中的BaseObjectName解析为非本地队列的队列或远程队列的本地定义(AMQ4480)

    严重性:20(错误)

    响应:更正队列定义。

    但我可以把它放在 艾尔试验

    --编辑--

    https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.pro.doc/q003120_.html

    那么我怎样才能得到我想要的行为呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   JoshMc    7 年前

    基于每个IIB实例放入本地队列管理器的以下流:

    IIB1 -> QM1 -> QLOCAL(L.TO.FLOW) CLWLRANK(0) CLWLPRTY(4) CLWLUSEQ(ANY)
    IIB2 -> QM2 -> QLOCAL(L.TO.FLOW) CLWLRANK(0) CLWLPRTY(3) CLWLUSEQ(ANY)
    IIB3 -> QM3 -> QLOCAL(L.TO.FLOW) CLWLRANK(0) CLWLPRTY(2) CLWLUSEQ(ANY)
    IIB4 -> QM4 -> QLOCAL(L.TO.FLOW) CLWLRANK(0) CLWLPRTY(1) CLWLUSEQ(ANY)
    

    *假设 CLWLRANK , CLWLPRTY ,及 NETPRTY 总之 CLUSRCVR

    CLWLPRTY .

    从集群工作负载管理算法的角度来看,队列实例可能不可用,原因有很多。我在本文末尾引用了知识中心,该中心提供了算法的详细解释。两个常见的原因是:

    1. 队列管理器已关闭

    2. 队列是 PUT(DISABLED)


    每个IIB实例将仅 GET 从同一队列管理器上的本地队列,IIB实例也被连接。在上面描述的设置中,这意味着在正常情况下,如果所有四个队列管理器都启动,则只有连接到QM1的IIB实例才会接收消息。


    Reference>Configuration reference>IBM MQ cluster commands>Workload balancing in clusters>The cluster workload management algorithm “,我提供了适用于您问题中所述设置的选项:

    从可能的目的地列表中选择目的地。

    1. A.将尽可能消除未启用put的队列 目的地。

    1. 如果出现以下三种情况之一,则使用队列的本地实例 是真的:

      • 在更广泛的适用条件范围内,这些点是正确的:

        A.根据队列所在集群中本地定义的CLUSRCVR通道的状态选择本地队列。 将此状态与以下CLUSSDR通道的状态进行比较: 将消息传送到远程定义的同名队列。

        在这种情况下,将选择远程通道,而不使用本地队列。

        B本地队列根据CLUSRCVR通道的数量选择,与相同状态的CLUSSDR通道进行任何比较, 这将把消息带到远程定义的相同队列 名称

        例如,在与队列相同的集群中有四个CLUSRCVR通道和一个CLUSSDR通道。所有频道都有相同的频道 非活动或正在运行的状态。

        本地队列。

    1. 如果只保留队列或主题的远程实例,则优先选择恢复的队列管理器,而不是挂起的队列管理器。

    2. 如果队列或主题的多个远程实例仍然存在,则包括所有非活动或正在运行的通道。国家

      • MQCHS_INACTIVE

      • MQCHS_RUNNING

    3. 如果队列或主题的远程实例不存在,则处于绑定、初始化、启动或停止状态的所有通道都将被删除 包括。列出了状态常数:

      • MQCHS_BINDING

      • MQCHS_INITIALIZING

      • MQCHS_STARTING

      • MQCHS_STOPPING

      • MQCHS_RETRYING
    4. 如果队列或主题的远程实例不存在,则包括处于请求、暂停或停止状态的所有通道。状态常数 名单如下:

      • MQCHS_REQUESTING

      • MQCHS_PAUSED

      • MQCHS_STOPPED

    推荐文章