2014-02-15 55 views
0

背景:奇怪的性能問題,C#和RabbitMQ的

我已經開發了幾個WCF服務導入數據。在接收數據時,我的服務通過EasyNetQ服務總線發佈請求,連接到RabbitMq服務器。

然後,消費者接受請求,將其序列化爲XML並將其作爲參數發送給存儲過程進行處理。該存儲過程依次執行用於插入或更新數據的表合併。

問題:

我的問題是,我有時會ACK消息/秒的相當不錯的量,有時表現得非常差,進而導致我的隊列中RabbitMQ的建立。

我的應用程序使用了以下技術:

  • TopShelf託管的Web服務。
  • Windsor依賴注入
  • 攔截器用於記錄,處理異常和時序性能。 EasyNetQ作爲消息總線。
  • RabbitMq作爲消息代理。

我曾嘗試以下操作:

  • 執行的相同的消息幾次似乎 執行時間強烈變化。在SQL Server Management Studio中執行存儲的 過程時,對於所有重複,執行時間大約是 。
  • 將我的解決方案連接到本地的RabbitMq服務器和本地的數據庫 。
  • 刪除交易處理的攔截器。
  • 更改我的數據庫連接類創建\打開一個新的連接 爲每個調用重用現有的連接(刪除使用 語句的SQL連接)。

有沒有人有什麼想法可能會導致我的問題?

Thanx提前。 Matias

+1

您應該儘可能記錄日誌並將瓶頸範圍縮小到您管道中的特定位置。沒有它,你只能猜測。由於管道跨越多個子系統和技術,瓶頸可能在任何地方。 –

+0

它可以是任何數量的東西。我會遵循@ WiktorZychla的建議,並嘗試用伐木來縮小瓶頸。您也可以嘗試刪除管道的特定部分。一個好的DBA應該能夠查看SQL Server分析工具,並告訴你可能會遭受糟糕的性能損失。 EasyNetQ消息分派器在單個線程上運行,因此您可能需要嘗試異步訂閱方法和異步數據庫IO。 –

回答

0

假設緩慢來自兔子 - 檢查磁盤的I/O,以防您的郵件持久且持久,以防您不涉及磁盤時檢查內存水印,以防您運行高在記憶中,兔子會將它的消息刷新到磁盤,這將導致在這個過程中顯着緩慢。