在使用来自.NET WCF服务的MQ系列时,我遇到了一些模糊的性能问题。
该服务是多线程的-它每秒接收多个请求并将其放到队列中。由于连接到队列的成本被认为是昂贵的,所以我决定该服务是一个单例,它只连接一次队列(一旦实例化),然后接受多个并行调用将消息放入队列。
在我当前的环境中,每秒最多可以处理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);
}
}这就是它的本质。我是做错了什么,还是忘了设定一些选项来帮助我取得更高的成绩?
发布于 2014-01-08 14:33:55
我猜,当多个线程试图使用相同的连接来放置消息时,您可能进入了一个争用状态。我建议您在创建到队列管理器的连接时尝试使用MQC.MQCNO_HANDLE_SHARE_BLOCK选项。此选项表示进程的一个线程分配的连接和对象句柄可由属于同一进程的其他线程使用。但是,一次只有一个线程可以使用任何特定句柄;也就是说,只允许连续使用句柄。如果线程试图使用另一个线程已经在使用的句柄,则调用将阻塞(等待),直到句柄可用为止。
关于不同MQCNO_的更多详细信息是这里
https://stackoverflow.com/questions/20982231
复制相似问题