2012-01-09 245 views
3

是否有一些標準配置設置,服務或工具從一個隊列接受消息並將它們移動到另一個隊列?自動處理死信息問題,並提供一些重試功能?我認爲這是「MSMQ消息路由」的作用,但似乎無法找到它的文檔(Windows Mobile 6除外,我不知道這是否相關)。將MSMQ消息從一個隊列路由到另一個隊列

語境:

據我所知,使用MSMQ時,你應該總是寫到本地隊列,這樣的失敗是不太可能的,然後X應該是郵件移動到遠程隊列。我的理解錯了嗎? Biztalk這樣的消息傳遞基礎設施是在哪裏進來的?是否沒有必要首先寫入本地隊列以絕對確保成功?我應該自己創建X嗎?

+0

原來我困惑的約80%是因爲主要的地方去,如果你想了解MSMQ是*不* MSDN,這就是我一直在尋找,而是在TechNet上:HTTP: //vmware.microsoft.com/en-us/library/cc753070(v=WS.10).aspx – khanfx 2012-02-14 20:51:46

回答

5

正如休指出的那樣,您只需要一個MSMQ隊列就可以在一個方向上從源發送消息到目的地。源和目標可以位於同一臺服務器上,同一網絡上或互聯網上,但源和目標都必須運行MSMQ服務。

如果您需要執行'消息'路由(例如,處理來自多個源或目標隊列的消息的交換機,或根據消息的類型將消息路由到一個或多個訂戶等),您需要的不僅僅是MSMQ隊列。 雖然您當然可以使用BizTalk來執行郵件路由,但如果您不需要使用BizTalk的其他功能,則這將會很昂貴/過量。會推薦你看看開源,或者自己構建一些自定義的東西。

但是通過「路由」,你可能指的是使用HTTP作爲傳輸時的隊列重定向功能。通過互聯網(例如herehere)。

回覆:無法傳送重試

我認爲你有大部分的概念 - 通常是消息傳遞重試功能應該是隱含在MSMQ。如果MSMQ在定義的到期之前無法傳送消息,則它將在死信隊列中返回,然後源可以處理來自DLQ的消息,然後對它們進行「補償」(例如,反轉「發送」的動作,向用戶指示失敗等)。

然而,在目的地「處理」類型重試將需要由目標應用程序/聽衆來執行(例如,如果目標系統是向下,死鎖等)

普通的方法可以做到這包括:

  • 使用2階段提交 - 分佈式工作單位下,拉消息關閉MSMQ並對其進行處理(例如,將數據插入數據庫,改變一些記錄等情況),並且如果遇到任何故障,然後將消息留在隊列中,並且數據庫更改將回滾。
  • 應用程序級別重試 - 即在目標系統上發生「可重試」類型錯誤(由於負載,死鎖等導致的超時),然後休眠幾秒鐘,然後重試同一事務。

然而,在大多數情況下,無限期處理重試都是不可取的,你最終將需要承認失敗,並實現一種機制來記錄信息,且錯誤,並從隊列中刪除。

但是我不會'重試'業務失敗(例如業務規則,驗證等),並且應該在您的要求中定義行爲如何處理這些問題(例如,帳戶透支,消息格式不正確或無效等),例如通過將「NACK」類型的消息返回給源。

HTH

+0

謝謝nonnb!通過閱讀您的建議,我最終找到了像BizerBus和Mass Transit這樣的BizTalk輕量級替代品,但更重要的是找出哪些層*不是必需的*,現在我們可以簡單地通過VPN鏈接將msmq消息發送到遠程系統比擁有所有的中間層。 – khanfx 2012-02-14 20:51:17

+0

出於興趣,您可能還需要查看基於AMQP的隊列,如RabbitMQ和[Azure Service Bus](http://azure.microsoft.com/zh-cn/documentation/articles/service-bus-amqp-overview/ )。在Rabbit中,交換機可以通過配置將消息路由到另一個交換機,無需額外的代碼。 – StuartLC 2014-09-24 15:04:31

2

MSMQ將消息從一個隊列發送到另一個隊列。

比方說,你在遠程機器上有一個隊列。您想要發送消息到該隊列。

所以你創建一個發件人。發件人是可以使用MSMQ傳輸發送郵件的應用程序。這可能是一個.net客戶端隊列(System.Messaging),一個WCF服務消費者(無論是在netMsmqBinding或msmqIntegrationBinding,使用MSMQ適配器的BizTalk,等等等等

當你發送郵件時,實際發生的事情是:

  1. 發件人計算機上的MSMQ隊列管理器中寫入消息到一個臨時本地隊列。
  2. 發件人計算機上的MSMQ隊列管理器連接到在接收計算機上的MSMQ管理器和發送該消息。
  3. 接收者機器上的MSMQ隊列管理器將消息放到目標上在隊列中。

在某些情況下,MSMQ將遇到由於某種原因或其他原因無法在目標隊列上接收的消息。在這些情況下,如果您已經指出消息將使用死信隊列,那麼MSMQ將確保該消息被轉發至死信隊列。

+1

這對我很有用。對於試圖理解這個問題的人來說,更多的信息是,經過一些測試後,我發現了計算機管理|服務和應用|消息隊列|傳出隊列是查找郵件的傳輸位置的正確位置。 – khanfx 2012-02-14 20:46:35

+0

@tom儘管對MSMQ進行了合理的描述,但它並沒有回答OP的「將MSMQ消息從一個隊列路由到另一個隊列」的問題。點對點傳輸不是路由。 – MickyD 2014-06-06 12:30:16

+0

同意 - @ khanfx請取消我的帖子作爲答案並獎勵另一個答案。 – 2014-06-09 09:57:08

相關問題