Amqmdnet - 打开/关闭每条消息的队列是否有效?

时间:2017-09-01 13:59:32

标签: .net performance ibm-mq

我们有一些代码可以将消息发送到队列。它使用的是amqmdnet dll版本8.0.0.6。

队列管理器(Queuemanager)在应用程序启动时实例化一次并在整个过程中使用。发送消息时,会创建一个队列对象,然后关闭。我们应该为每条消息创建一个队列对象,还是只使用一个实例?我们只写消息,没有读取。

以下是一些代码:

 public QueueResult Enqueue(string message)
        {
            QueueResult result;
            using (var queue = _queueManager.AccessQueue(_queueName, MQC.MQOO_OUTPUT + MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING))
            {
                var mqMessage = new MQMessage
                {
                    Format = "MQSTR",
                    Encoding = 546,
                    CharacterSet = 437
                };

                mqMessage.WriteString(message);

                var options = CreateOptions();

                queue.Put(mqMessage, options);

                result = new QueueResult
                {
                    CompletionCode = options.CompletionCode,
                    ReasonCode = options.ReasonCode
                };

                queue.Close();
            }

            return result;
        }

public IQueue AccessQueue(string queueName, int openOptions)
{
       return new Queue(mqQueueManager.AccessQueue(queueName, openOptions));
}

1 个答案:

答案 0 :(得分:3)

旧的IBM MQ developerWorks文章提供了一些非常好的建议,一般是“The top 15 WebSphere MQ best practices”。具体到您的问题,它陈述如下:

  

牢记绩效

     

尽管MQ是为高事务量而构建的,但糟糕的体系结构和应用程序设计可能会损害其尽可能快速有效地处理消息的能力。为了缓解潜在的性能问题,以下是一些建议:

     
      
  • 如果您要重复使用它们而不是反复打开和关闭,连接和断开连接,请保持连接和队列处于打开状态。
  •   

从IBM MQ Client的角度来看,每个队列的打开和关闭都是网络上的往返,具体取决于MQ客户端和MQ队列管理器之间的延迟,这可能导致MQ在您处理MQ时需要处理的延迟打开和关闭队列,例如检查您是否有权打开队列并打开磁盘上的基础q文件。

如果要将持久性消息放在工作单元之外,这可能会导致队列管理器与正在读取消息的应用程序发生锁定争用(如果您放入的队列是读取应用程序,则读取应用程序可能是通道代理程序QREMOTE)。

在同一工作单元下放置多条消息也会提高性能,取决于底层存储的数量。