IBM Websphere MQ Latency用于存储持久性消息.NET客户端

时间:2018-03-29 00:07:03

标签: .net ibm-mq

当MQ服务器收到Put()请求时,哪些因素会影响存储消息?以下是潜在因素:

1)在内存中缓存消息一段时间,或

2)收到一定数量的消息时

3)当收到消息的某个字节阈值时

4)MQ服务器立即为每条消息保存它。

更新

也就是说,当Put()返回时,消息是否已根据上述因素保存到硬盘或缓存中?

非常感谢任何有关官方文档的信息和链接。

以下是使用Put()的简单方案。

     void PutMessages()
    {
         Open(ConnectionMode.Write);

            // putting messages continuously
            for (int i = 1; i <= numberOfMsgs; i++)
            {
                PutMessage(GetMessageInBytes(i));
            }

            queue.Close();
            queueManager.Disconnect();          
    }

    void PutMessage(byte[] messageString)
    {

        // creating a message object
        message = new MQMessage();
        message.Write(messageString);
        message.Format = MQC.MQFMT_STRING;
        message.CharacterSet = 1208;// IbmUtf8Encoding;
        message.Persistence = MQC.MQPER_PERSISTENT;

        var options = new MQPutMessageOptions
        {
            Options = false ? MQC.MQPMO_SYNCPOINT : MQC.MQPMO_NO_SYNCPOINT
        };

        queue.Put(message, options);            

    }

    public void Open(ConnectionMode connectionMode)
    {
        var connectionSettings = new Hashtable
        {
            {MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED },
            {MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT }
        };

        int openOptions = 0;

        switch (connectionMode)
        {
            case ConnectionMode.Read:
                openOptions = MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING;
                break;
            case ConnectionMode.Write:
                openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
                break;
        }
        queueManager = new MQQueueManager(queueManagerName);
        queue = queueManager.AccessQueue(queueName, openOptions);
    }


    public enum ConnectionMode
    {
        Read,
        Write
    }

1 个答案:

答案 0 :(得分:0)

在IBM MQ v9知识中心页面&#34; Application design and performance considerations&#34;它有这两个说:

  

将持久性消息放在同步点

下      

持久性消息应该放在同步点下。这是   因为在同步点之外获取持久性消息时,如果是   得到失败,应用程序无法知道是否   已经从队列中获取了消息,以及是否,如果是   消息已经得到,然后它也已经丢失。什么时候来   同步点下的持久性消息,如果有任何失败,则   事务被回滚,持久性消息不会丢失   因为它仍然在队列中。同样,当持久性   消息,将它们放在同步点下。放和的另一个原因   在同步点下获取持久性消息是持久性的   IBM MQ中的消息代码针对同步点进行了大量优化。所以推杆   在同步点下获取持久性消息比放置更快   并在同步点之外获取持久性消息。

     

但是,在外部放置和获取非持久性消息会更快   同步点,因为IBM MQ中的非持久代码已经过优化   在同步点之外。 放置并获取持久性消息   以磁盘速度运行,因为持久性消息持久存在   磁盘。 但是,放入和获取非持久性消息的时间是   CPU速度,因为没有涉及磁盘写入,甚至没有   使用同步点。

     

如果某个应用程序正在收到消息而且事先并不知道   无论是否持久,GMO选项   可以使用MQGMO_SYNCPOINT_IF_PERSISTENT。

来自IBM的Chris Frank在Capitalware's MQ Technical Conference v2.0.1.6发表了题为“{3}}的演讲 More Mysteries of the IBM MQ Distributed Logger, Slide&#34;如果我不使用交易怎么办? (2)&#34;第87页说明:

  
      
  • 与不使用Syncpoint对比:      
        
    • 每个MQPut将导致至少一次对日志文件的物理写入      
          
      • 在此期间将阻止推送应用程序
      •   
    •   
  •