簡體   English   中英

消息隊列方案-隊列和遠程Web服務

[英]Message Queueing Scenario - Queueing and remote web service

(請參閱下面的幻燈片鏈接)我正在嘗試創建與遠程Web服務交互的,可審核的請求和響應服務。 我在為我的方法選擇正確的實現時遇到一些麻煩。 基本上,我需要執行該工作的方式如下。

  • 請求者應用程序(A)將生成請求XML,並將其添加到請求“隊列”中。 然后,請求處理器將從“隊列”中獲取未處理的記錄,並將其發布到具有唯一ID的遠程Web服務(X),如果請求成功,則請求將被保留/(requestComplete標志= 0) “隊列”將在以后的時間重試。

  • 如果請求成功它被保持/(requestComplete標志= 1),並且不重試

  • 稍后,接收者Web服務(B)從請求中調用的“ X”服務接收響應。

  • 然后,“ B”搜索請求記錄以查找原始請求,並將“ A”請求和“ X”響應相關聯(使用唯一ID進行匹配)。

  • 響應會執行一些其他處理,並且來自“隊列”的記錄將更新為已完成。

這樣,從請求到響應都有完整的審核跟蹤。 通過查看“隊列”記錄,可以看到原始請求是何時發出的,如果請求有錯誤。 同樣,通過響應,我可以看到何時收到響應。

我曾考慮過兩種實現此方法的方法。

  1. 方案1使用一個數據庫表作為一個請求隊列,響應隊列以及審核跟蹤。 帶有GUID的表中的一行,可以在過程的任何階段(請求->處理->接收)進行引用,並在此過程中進行更新。 問題是我收集的這種實現方式不能像MSMQ(推送/彈出)之類的真正隊列那樣操作,可交易且不可擴展。
  2. 方案2對於實際的隊列實現,我進行了一些研究,並認為將使用可能具有多個隊列的MSMQ。 處理器隊列來處理請求的處理和發送,然后將完成的請求推送到接收器隊列,以等待來自“ X”的響應。 這種方法的唯一麻煩是沒有清晰的審計線索,即,一旦收到請求,就將其從隊列中刪除,同樣是響應。 除非我使用數據庫表存儲請求和響應隊列以進行審核。 我已經讀過,MSMQ存在日記類型的事務,它確實將什么記錄排入隊列,但是我正在尋找更完整的解決方案或關於此事的建議。

只是一些注意事項:

  • 請求“ A”發送給具有唯一ID的“ X”,“ X”發送對引用該唯一ID的“ B”的響應。 這允許“ B”跟蹤請求記錄“ A”。
  • 我需要能夠重試失敗的“ X”嘗試(需要重試任何錯誤400或404)
  • 我需要能夠對請求/響應進行審核跟蹤。
  • 我正在使用C#,WCF,MSMQ,SQL Server 2008 R2,VS 2012。

如果有人對采用哪種方法有任何建議或指導,對上述方案的最佳做法有任何意見或知識,那將是非常有益的。

我建議您查看帶有sagas的服務總線(我的首選是Rhino Service Bus ,但NServiceBus也有很多吸引力,並且還有Mass Transit

基本上,服務總線將處理排隊(又稱為發送)和出隊(又稱為接收和處理)的消息。 然后,傳奇將幫助維護對話的狀態(對話包含多個消息)。

Rhino Service Bus中的延遲消息和NServiceBus中的超時(我沒有使用Mass Transit的經驗)可以很好地處理稍后重試的問題。

我會將結果日志存儲在數據庫中,以使其更易於查詢和報告。 我還寧願將服務總線與MSMQ(或任何其他隊列)一起使用,而不是將數據庫表用作“隊列”-前者是專門為您的情況設計的,而后者是一種更通用的產品,可以處理許多不同的情況,並且因此,它不會像隊列實現(例如MSMQ)那樣高效(盡管它可以做到-但擴展變得更加困難)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM