2014-01-07 64 views
0

從.NET WCF服務使用MQ系列時,我遇到了一些模糊的性能問題。使用.NET中的MQ系列的高吞吐量

該服務是多線程的 - 它每秒接收很多請求並將其放入隊列中。由於連接隊列被認爲是代價高昂的,我決定這個服務是一個singleton,它連接一次到隊列(只要它被實例化),然後接受許多並行調用來把消息放到隊列中。

在我目前的環境下,我可以每秒處理850個呼叫。在這個數字之後,事情開始變得非常錯誤。突然間,我開始從WCF發出超時錯誤。我所有的分析都指出,PUT命令花費的時間太長,我猜測它是同步線程;這意味着我有更多的要求,每個要求的時間越長。

從我的代碼部分樣本:

​​

和他們談到寫作方法:

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); 
     } 

    } 

這是它的本質。我做錯了什麼,或者忘了設置一些可以幫助我實現更高性能的選項?

+0

您可以顯示連接選項(MQC.CNO_xxx)你正在使用用於創建連接? – Shashi

+0

@Shashi,我想我實際上並沒有使用任何東西。我是不是該? –

回答

1

我猜你可能會進入競爭狀態,當多個線程試圖使用相同的連接投入消息。建議您在創建與隊列管理器的連接時嘗試使用MQC.MQCNO_HANDLE_SHARE_BLOCK選項。此選項表示由進程的一個線程分配的連接和對象句柄可以被屬於同一進程的其他線程使用。但是,一次只有一個線程可以使用任何特定的句柄;也就是說,只允許連續使用句柄。如果一個線程試圖使用另一個線程已經在使用的句柄,則調用會阻塞(等待),直到句柄變爲可用。在不同的MQCNO_

更多細節here