2016-11-16 79 views
2

在Rebus中發佈時,如果MSMQ未運行或MSMQ服務中存在其他錯誤,則會引發異常。在發佈前是否有內置的解決方案(在Rebus中)?或者我必須使用.Net服務控制器?Rebus傳輸,MSMQ/SQL

關於使用SQLServer作爲傳輸方式,WAN中的性能和可靠性如何? Rebus如何做到這一點?是否有一些示例代碼或什麼?

Transport(t => t.UseMsmq...) 
Transport(t => t.UseSqlServer...) 

回答

0

雖然滷麪發佈,如果MSMQ不運行或MSMQ服務的一些其他錯誤,它會拋出異常。在發佈前是否有內置的解決方案(在Rebus中)?或者我必須使用.Net服務控制器?

如果我是你,我只想嘗試await bus.Send(..),然後捕獲任何可能由此引發的異常。通過這種方式,你可以更好地處理錯誤類型,並且避免了你將會遇到的競爭條件(*)

我沒有一般性的建議,當在這個中捕獲異常時該怎麼做案件。

通常風險很低,因此實際建立一個可以克服它的機制是沒有意義的,因爲您可能會忘記將想要作爲ERROR發送的消息的內容記錄下來,有人手動處理它。

但有時候,建立某種「本地發件箱」或可用於臨時存儲無法發送的消息的東西可能是有意義的。但是由於MSMQ是一個本地運行的服務,您可以像監視所有其他Windows服務一樣監視它,並且在與它進行通信時不會涉及任何遠程處理,因此可以使其比其他任何其他服務更可靠。

關於使用SQLServer作爲傳輸,WAN中的性能和可靠性如何? Rebus如何做到這一點?是否有一些示例代碼或什麼?

如果您的要求不高,使用SQL Server作爲傳輸可以正常工作。 SQL Server並不是一個真正的消息隊列,它不能很好地處理長隊列(如在10或100幾千條消息中),因爲隊列長度會影響接收性能。

此外,它會要求您在發送和接收郵件時進行遠程處理,所以我的猜測是,當您發送郵件時,您將很難使其與MSMQ一樣可靠(這並不重要接收時,因爲端點會在中斷後再次恢復連接時簡單恢復 - 但是當您第一次發送時(可能是在Web請求中),您確實希望傳輸能夠處理該消息)。

the samples repository中有大量的示例,並且Rebus.SqlServer repository有幾個測試,如果您想在所有方面都使用SQL Server,可能會比較有趣。例如。該TestSqlAllTheWay測試樂趣IMO :)


(*)如果你這樣做:

  1. 檢查MSMQ有
  2. 發送

你無論如何都會得到一個異常如果MSMQ停止/打破/ 1至2之間的任何權利。

+0

感謝您的快速和完美的答案。 我的問題是關於消息大小。 MSMQ消息有一個限制。我的消息數量少於可能超過此限制的數量。我應該實施Splitter Aggregator模式還是Rebus有一些解決方案? –

+0

MSMQ允許消息爲4 MB。如果你使用'.Options(o => o.EnableCompression())'Rebus將ZIP郵件,如果它們大於某個閾值,從而降低遇到這個問題的風險 – mookid8000

+0

如果你需要傳輸實際數據(如:字節數量,例如文件和東西),您可以使用[數據總線](https://github.com/rebus-org/Rebus/wiki/Data-bus) - 它可以非常容易地創建附件,然後在您的消息中作爲ID傳輸,然後您可以在接收端重新讀取它們。IOW Rebus的數據總線只是一個很好的API,用於實施[聲明檢查](http://www.enterpriseintegrationpatterns.com /patterns/messaging/StoreInLibrary.html)模式 – mookid8000