2011-04-13 67 views
2

我需要關於我的WCF服務隊列設計的建議。 所以,我有一個wcf服務和很多客戶端。客戶端生成消息並將它們放入隊列以供我的服務進行處理。 服務處理它們的異步和客戶端不需要將消息放入隊列的回調或響應。WCF服務的隊列實現

我的服務需要使隊列中的消息出隊以供多線程處理。但是,如果我的服務會停止或失敗,或者服務器立即關閉 - 此服務必須重新處理消息,但這不會影響處理。

所以,我認爲msmq隊列的實現。 Msmq讓我做出好的隊列,但是如何實現這個需求:重新處理消息,那個消息沒有被處理到最後?

可能有人會給我另一個下注的建議。 感謝您的幫助。

+0

如果服務停止,消息應該保留在隊列中並在再次啓動時進行處理,這是不是發生了?如果是這樣,您如何託管讀取MSMQ的WCF進程? – 2011-04-13 12:16:48

+0

但是服務是否可以從隊列中取消消息並開始處理?同時,另一個處理線程從隊列中取出另一個消息用於處理和啓動進程。然後我們終止服務進程,重啓後可以發現隊列中的2個項目沒有處理? – cyssima 2011-04-13 13:43:37

+0

每個線程應該參與一個事務,所以這兩個消息應該在那裏。另一種方法是創建指向同一隊列的多個進程,而不是擁有多個線程。這是「競爭消費者」模式,可以使用MSMQ 4。 – 2011-04-13 17:30:06

回答

0

因此,最後我選擇MSMQ中的事務,並將事務對象傳遞給線程,以便與MSMQ一起工作。這是相當快的。

0

這裏的關鍵是託管服務的機器在哪個服務器操作系統上運行。如果您在技術上使用Server 2008(或Vista),則可以利用MSMQ 4自動中毒消息處理。這會自動將消息從隊列中移除到特殊的毒性隊列,以便服務可以繼續處理消息。在MSMQ 3中,您必須在您的代碼中執行此操作。 This article on MSDN應該給一個好的開始和this article shows the poison消息處理代碼。

我看不出您需要擔心多線程服務代碼。如果您希望獲得高吞吐量,那麼請使用集羣式MSMQ服務器和負載均衡的WCF服務,其方式比試圖推出基於MSMQ的多線程代碼更可靠。