高吞吐量使用.NET的MQ系列

时间:2014-01-07 21:26:11

标签: .net ibm-mq

从.NET WCF服务使用MQ Series时,我遇到了一些模糊的性能问题。

该服务是多线程的 - 它每秒接收许多请求并将其放入队列。由于连接到队列被认为是昂贵的,我决定该服务是一个单独的,它连接一次到队列(一旦它被实例化)然后接受许多并行调用将消息放入队列。

在我目前的环境中,我每秒最多可以处理850个电话。在这个数字之后,事情开始变得非常错误。我突然从WCF开始收到超时错误。我的所有分析都指出PUT命令花费的时间太长而且我的猜测是它同步了线程;这意味着我拥有的请求越多,每个请求的时间就越长。

我的代码中的一些示例:

// The objects below are members of the singleton service
_mqQueueManager = new MQQueueManager(_config.QueueManagerName,
                            channelConfig[0], channelConfig[2]);

_mqQueueEscrita = _mqQueueManager.AccessQueue(_config.QueueConnectionName,
                            MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_OUTPUT);

他们来自写作方法:

    public void EscreverMensagemObject(object entrada_)
    {
        try
        {

            var mensagemMq = new MQMessage { Format = MQC.MQFMT_STRING, Expiry = MQC.MQEI_UNLIMITED };
            mensagemMq.WriteObject(entrada_);
            var opcoesMqPut = new MQPutMessageOptions();

            _mqQueueEscrita.Put(mensagemMq, opcoesMqPut);
        }
        catch (MQException mqEx)
        {
            if (mqEx.ReasonCode == MQC.MQRC_CONNECTION_BROKEN)
                Reconectar();
            else
                throw new Exception(string.Format(ERRO_AO_ESCREVER_MENSAGEM, mqEx.Reason, mqEx.Message), mqEx);
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format(ERRO_AO_ESCREVER_MENSAGEM, ex.HResult, ex.Message), ex);
        }

    }

这就是它的本质。我做错了什么或忘记设置一些可以帮助我获得更高性能的选项吗?

1 个答案:

答案 0 :(得分:1)

我猜你在多个线程试图使用相同的连接来放置消息时可能会遇到竞争状态。我建议您在创建与队列管理器的连接时尝试MQC.MQCNO_HANDLE_SHARE_BLOCK选项。此选项指示由进程的一个线程分配的连接和对象句柄可以由属于同一进程的其他线程使用。但是,一次只有一个线程可以使用任何特定的句柄;也就是说,只允许串行使用句柄。如果某个线程试图使用另一个线程已经在使用的句柄,则该句柄会阻塞(等待),直到该句柄变为可用。

有关不同MQCNO_的更多详细信息,请here