為什麼 MSMQ 比 WCF QueueService 快?
netNamedPipeBinding我在帶有綁定的控制台中有自託管的 WCF 服務。該服務只有一個空方法Send(DataTable bulk)[ServiceContract] public interface IWcfQueueService { [OperationContract] void Send(DataTable bulk); } public class WcfQueueService : IWcfQueueService { public void Send(DataTable bulk) { // Here would be something like _bulks.Add(bulk); // BUT, for now it is empty method and still it's slower than MSMQ } }我的客戶從 DB 獲得 200K 輸入並使用我們的 BoundedThreadPool 處理它(僅創建,比如說,20 個執行緒)。每個輸入都用不同的執行緒處理。每個執行緒都執行
MyMethod並在最後MyMethod將結果添加到bulkManager.public void MyMethod(string input) { var res = ProcessInput(input); bulkManager.Add(res); }當
bulkManager累積 N 個項目(=bulk)時,它將批量傳遞給另一個執行緒,它所做的只是使用以下兩種方法之一將該批量加入隊列:
- 如果啟用了 wcf:
wcfQueueService.Send(bulk);- 否則,如果啟用了 MSMQ:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});這兩種方法都有效,但 MSMQ 的工作速度要快得多。使用 MSMQ 客戶端可以在 20 秒內處理大約 80K 塊,而使用 wcf 只能處理 20K-30K 塊。我不明白為什麼會這樣。我的 WCF 像 MSMQ 一樣在不同的程序中執行。另外,我的 WCF 不儲存任何東西,它有空方法。那麼為什麼 MSMQ 會贏得 WCF 呢?
更新
正如
leppie建議的那樣,我嘗試了 .NetRemoting。NetRemoting 確實提高了速度。客戶端處理了 60K。但,
- 它仍然比 MSMQ 慢
- 當我讀到 .Net Remoting 已被 WCF 棄用時,WCF 應該比 .Net Remoting 快,那麼為什麼我知道我的 wcf 更慢?也許我的綁定是錯誤的?
你不是在比較喜歡和喜歡。
最明顯的區別是,在 WCF 案例中,您的時間包括整個服務端通道堆棧和操作呼叫的執行,而您的直接 MSMQ 案例僅測量在客戶端排隊有效負載的時間。請記住,WCF 中的服務端處理包括您的 DataTable 對象的反序列化,如果您的體積因子 N 很大,這可能會非常昂貴。
更重要的是,根據您配置服務實例化和節流旋鈕的方式,來自客戶端的請求可能比服務配置處理的速度更快,導致請求本身在服務端排隊等待執行。
此外,根據您配置綁定的方式,可能存在其他顯著差異,例如安全性。順便說一句,您是否真的使用 NetNamedPipeBinding (如您的問題所述)而不是標題似乎暗示的 NetMsmqBinding?如果是這樣,使用預設綁定配置,您將完全不必要地加密和簽署每條批量消息,這在您的直接 MSMQ 案例中不會發生。這些對大消息的加密操作也將相對昂貴。
與定義為 OneWay 的 WCF 操作進行更好的比較。