Dot-Net-4.0

如何並行處理 MSMQ 消息

  • January 29, 2016

我正在編寫一個 Windows 服務來使用 MSMQ 消息。該服務將具有高活動期(80k 消息很快收到)和長時間不活動(可能幾天沒有新消息)。

處理消息是非常受網路限制的,所以我從並行性中獲得了很大的好處。但是在不活動​​期間,我不想佔用一堆執行緒等待不會很快到來的消息。

MSMQ 介面似乎非常關注同步工作流 - 獲取一條消息,處理它,獲取另一條消息等。我應該如何建構我的程式碼,以便我可以在高活動期間利用並行性而不是捆綁一堆沒有活動期間的執行緒數?使用 TPL 的獎勵積分。虛擬碼將不勝感激。

多年來,我已經完成了 MSMQ(包括移動實現)的分配,您對“同步工作流”的描述是正確的。並不是說您不能通過 TPL 獲取各種消息信封並在不同的核心上處理它們……限制因素是讀/寫隊列……本質上是一個串列操作。例如,您不能一次發送 8 條消息(一台具有 8 個核心的電腦)。

我有類似的需求(不使用 System.Messaging 命名空間),並在我讀過 Campbell 和 Johnson 的“Parallel Programming with Microsoft.NET”一書中的幫助下解決了這個問題。

查看他們的“並行任務”一章,特別是使用全域隊列的部分,該隊列與每執行緒本地隊列協作進行工作處理(即 TPL),使用“工作竊取”算法來執行負載平衡。我在一定程度上模仿了他們的解決方案。我係統的最終版本在性能上有很大的不同(從每秒 23 條消息到超過 200 條消息)。

根據您的系統從 0 到 80,000 所需的時間,您需要採用相同的設計並將其分佈在多個伺服器(每個伺服器具有多個處理器和多個核心)上。從理論上講,我的設置需要不到 7 分鐘的時間來打磨所有 80K,因此通過添加第二台電腦,它將減少到大約 3 分 20 秒等,等等,等等。訣竅是工作竊取邏輯。

深思熟慮……

快速編輯:順便說一句,該電腦是戴爾 T7500 工作站,具有雙四核 Xeons @ 3GHz、24 GB RAM、Windows 7 Ultimate 64 位版本。

引用自:https://stackoverflow.com/questions/5503954