2012-04-20 59 views
2

不可正對MSMQ或WCF的專家,我讀到了一個關於它的公平位,聽起來和看上去很不錯。 我正在努力開發一些東西,最終但首先是一些理論,它需要堅固耐用。MSMQ,WCF和魯棒性

MSMQ我想將一個單獨的服務器上託管。

將有2個WCF服務。一個用於傳入消息,另一個用於傳出消息(需要的消息,不那麼一些內部處理/驗證其放置在傳出消息隊列或也許發送電子郵件/文本消息/無論)

我與正確的配置理解,我們可以讓系統具有事務性(不會丟失任何消息),並且只能發送一次,所以不會有重複消息的機會。

應用程序/服務將多線程處理消息,其中將有成百上千的消息。

但是在處理消息或通過服務生命週期期間,如果服務器崩潰怎麼辦?如果服務器重新啓動會怎麼樣?如果服務因爲任何原因拋出異常怎麼辦?怎麼可能不會丟失那條消息,但有些如何將它放回隊列中等待它再次被處理? 另外,如何確保服務的穩健性能夠再次產生?

我會很感激的任何建議和細節在這裏。 WCF/MSMQ有相當多的選擇。

+0

您可以使用事務,而不是...即使不順心的事,之前發生崩潰或沒有發送或者所有的消息被髮送。 – Milee 2012-04-20 10:55:27

回答

9

你的假設:

MSMQ我想將一個單獨的服務器上託管。

不正確。 MSMQ安裝在所有想要參與消息隊列的機器上。

將會有2個WCF服務。一個用於傳入消息和其他 用於輸出消息

在最典型的結構中,目標隊列是本地偵聽服務。

例如,您ServiceA將有一個本地隊列從它的讀取。 ServiceB也有一個從中讀取的本地隊列。如果ServiceA想要調用ServiceB,它會將消息放入ServiceB的本地隊列中。

我用正確的配置理解,我們可以有系統,以便 ,它可以是事務性的(沒有消息曾經失去)

這是正確的。這是因爲MSMQ使用稱爲存儲轉發的消息傳遞模式。有關說明,請參見here

本質上,它是安全的假設沒有消息丟失的原因是因爲從一臺機器到另一消息的傳輸,其實需要在三個不同的交易場所。

  1. 第一個事務:ServiceA寫入它自己的臨時本地隊列。如果失敗,則事務回滾並且ServiceA可以處理異常。
  2. 第二事務:ServiceA機器上隊列管理器發送消息到隊列ServiceB機器上管理器。如果失敗,則消息保留在臨時隊列中。
  3. 第三筆交易:ServiceB讀取消息關閉本地隊列。如果ServiceB消息處理程序方法拋出異常,則事務將消息傳回本地隊列。

的應用程序/服務將是多線程的處理消息

這是,如果你需要爲了在信息處理鏈被保存下來,除了罰款。如果你需要有序的處理,那麼你不能有多個線程,而不需要實現重新排序器來重新申請訂單。

我以爲MSMQ可以單獨承載,並有x服務器共享 隊列?

其希望參與消息交換所有服務器都安裝MSMQ。然後每個服務器可以寫入任何其他服務器上的任何隊列。

我認爲的原因是因爲如果服務器停機怎麼辦? 那麼如何將這些消息被髮送/接收到MSMQ

如果隊列是事務性則意味着對他們的消息被保存在磁盤上。如果服務器出現故障,那麼當它恢復時,消息仍然存在。當服務器關閉時,顯然不能參與消息交換。然而,消息仍然可以「送」到服務器 - 他們只是保持當地的發送者(在臨時隊列),直到目標服務器重新上線。

所以通過具有一箇中央MSMQ服務器(和具有它的鏡像/故障轉移) 則會有的機制保障正常運行時間

使用消息隊列是它是一個容錯傳輸的整點,所以你不需要保證正常運行時間。如果你有100%的可用性,那麼使用消息隊列幾乎沒有什麼理由。

如何將WCF通知是收到的消息嗎?

每個服務將監聽自己的本地隊列。當消息到達時,WCF運行時會導致調用處理方法並處理消息。

如何將服務通知發送消息

如果ServiceA未能將消息發送到ServiceB然後ServiceB將永遠不會被通知故障的故障。它也不應該。 ServiceA將處理傳輸失敗,而不是ServiceB。在這種情況下,您的期望會在服務之間形成一種硬耦合,消息排隊應該消除。

+0

謝謝!我很感激。我認爲MSMQ可以獨立託管,並有x服務器共享該隊列?我的想法是因爲如果服務器出現故障,該怎麼辦?那麼這些消息將如何發送/接收到MSMQ中,以便服務讀取和寫入?如果託管在與WCF服務相同的服務器上,那麼如果該服務器停機?它是如何可以讀/寫到隊列中,以便由具有一箇中央服務器MSMQ(和具有它的鏡像/故障轉移),那麼會出現的正常運行時間的機制保障。 – 2012-04-20 13:03:04

+0

雖然我沒有看到這個,但WCF將如何通知消息傳入?或者是否需要創建一個Windows服務/控制檯應用程序,以及時尋找隊列,獲取消息並調用WCF服務?它是如何工作的?如何通知服務發送消息失敗或新消息何時到達MSMQ? – 2012-04-20 13:04:25

+0

請參閱我的更新 – 2012-04-20 14:31:30

0

MSMQ可以存儲消息即使臨時關閉該服務或重新啓動計算機。
WCF的主要目標是從源到目的地的傳輸消息。運輸無所謂。在你的情況下,MSMQ是WCF的傳輸方式,並不明顯可以同時在線/可用客戶端和服務。但是,當接收到消息時,儘管使用什麼傳輸來發送消息,但您有責任正確處理它。