NServiceBus 概況
NServiceBus 被設計用來組合面向業務的服務,它並不是用來替代諸如 WCF 一類的RPC技術。
NServiceBus 不只包含通信模塊,像其他成熟的SOA和DDD項目一樣,它使用了多種組合的方法和技術。
本篇文章探討了 NServiceBus 和微軟相關產品的相似點和不同點。
相比 BizTalk 更接近 WCF
當人們聽到“服務總線”這個名詞時,一般會描繪出如上圖所示的畫面,像 BizTalk 一樣所有的通信都經過一個中央結點。這實際上描述的是一個代理的架構設計,而不是總線的架構設計。在總線架構中,物理實體並不是必須的。在這方面,NServiceBus 相比 BizTalk 與 WCF 更相似。
沒有物理的 WCF 結點可以指向到網絡拓撲結構中。NServiceBus 像 WCF 一樣,是基礎架構的一部分,運行進程內給定的應用程序代碼。
就像你可以編寫承載 WCF 的宿主進程並激活它一樣,NServiceBus 也是如此。NServiceBus 中的總線是一個虛擬的概念,它指的是運行在各種應用程序之間的框架對象集合。你可以把它想象成運行在你的代碼中的P2P網絡,如下圖:
有何不同?
[就像蘋果與橘子的不同。]
NServiceBus 的設計原則使得它的魯棒性可以經受住長期的考驗。事實證明,經過無數的技術更迭,NServiceBus 所基於的消息隊列不光是一個明智的實現選擇,更體現了其最主要的架構思想。在 NServiceBus 的字典中不存在阻塞這個詞。
作為一個通用的通信技術,WCF 並不強制使用消息隊列模式。相反,NServiceBus 采用這種模式,這對架構的影響是極其深遠的。
當依照 WCF 所支持的傳統 RPC 技術進行系統開發時,雖然可以簡單直接地使系統可以工作,但 RPC 原則在本質上會對系統的可擴展性和容錯性造成阻礙。在這一點上,即使是增加更多的硬件,收效也是微乎其微的。雖然 WCF 並不強制開發者沿着這條路走下去,但它也不能阻止問題的發生。NServiceBus 可以讓你從一開始就避免這些問題。
單向消息傳遞的可擴展性
在可靠性、可用性和可擴展性中,架構應該首先關注可靠性,畢竟一個產生不可靠結果的高可用性和可擴展性的服務也沒有什么價值的。消息隊列一個顯著的價值就是它可以應對各種錯誤場景。
就算錯過了幾分鍾的消息記錄,內部的消息仍然不會丟失。
學習曲線
當花了一些時間適應后,使用 NServiceBus 編寫代碼是相當簡單的,代碼將比以前更加簡短,當然也更加容易進行單元測試。一個金融服務領域的架構師這樣說:
雖然熟悉關於消息傳遞的思想需要花費數個星期,但是我們的開發人員只需要一個星期就可以完成一個發布/訂閱的解決方案,這確實的證明了 NServiceBus 讓編碼變的多么簡單。我們才剛開始 NServiceBus 的旅程,但已經因為它所能提供的而感到興奮了。——Charlie Barker