JointCode.Shuttle,一個簡單高效的跨 AppDomain 通訊的服務框架

JointCode.Shuttle 是一個用於進程內 AppDomain 間通訊的服務架構(不支持跨進程),它旨在取代運行時庫提供的 MarshalByrefObject 的功能。html

 

1. 使用場景
git

在 .net / mono 開發中,通常不太須要建立新的 AppDomain,但在一些 特定狀況 下,也許咱們須要使用一個新的 AppDomain,並在其中執行一些操做。github

當代碼跨越 AppDomain 邊界訪問另外一個 AppDomain 時,便產生了跨 AppDomain 通訊。這時候,您能夠考慮使用 JointCode.Shuttle。架構

 

2. 傳統跨 AppDomain 通訊方式的問題框架

通常來講,在進行跨 AppDomain 調用時,大部分人使用運行時庫默認提供的、基於 MarshalByrefObject 類繼承的通訊機制。這種方式最簡單,只要讓須要跨 AppDomain 操做的類繼承 MarshalByrefObject 便可,實現起來很方便。例如:ide

 1 namespace JoitCode.Shuttle.SimpleSample
 2 {
 3     public class MyService : MarshalByRefObject
 4     {
 5         public void Do() { }
 6     }
 7 
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             // 在默認 AppDomain 中建立一個子 AppDomain
13             var serviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null);
14             
15             var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap
16                 (typeof(MyService).Assembly.FullName, 
17                  "JoitCode.Shuttle.SimpleSample.MyService");
18 
19             myService.Do();
20 
21             Console.Read();
22         }
23     }
24 }
View Code

簡單是簡單,但這種方式也有一些侷限性。有什麼侷限性呢?性能

  • AppDomain 的訪問是單點的,即它只能由建立它的宿主(或稱父 AppDomain)訪問,而不能由其餘 AppDomain 訪問,即便是由相同宿主建立的其餘 AppDomain,甚至其宿主的父宿主也不行。
  • 缺乏靈活性,因爲要求服務類必須繼承 MarshalByrefObject 類,這限制了靈活性。
  • 性能問題,測試結果代表使用這種方式的跨 AppDomain 通訊要比普通對象訪問慢幾百到一千倍(示例
  • 雙向通訊,使用這種方式沒法實現雙向通訊。

除了 MarshalByrefObject 以外,可能還有 remoting、wcf 甚至於消息隊列等等跨進程的方式也能夠實現跨 AppDomain 通訊(做者本身沒嘗試過)。這些方式或多或少消除了上述那些限制,然而咱們也能想象獲得,原本是進程內通訊的事情,如今弄成進程間通訊,憑空增長許多開銷,那麼它們的性能必定比 MarshalByrefObject 更低,並且學習成本也會更高,實現起來也更復雜。學習

 

3. JointCode.Shuttle 的特色測試

與 MarshalByrefObject 相比,JointCode.Shuttle 除了具有相同的跨 AppDomain 通訊的功能以外,還有本身的一些特色:spa

  1. 面向接口/服務
  2. 能夠從一個 AppDomain 中訪問任何 AppDomain 的服務(採用 MarshalByrefObject 方式,只能從父 AppDomain 訪問子 AppDomain)
  3. 更好的性能:速度比 MarshalByrefObject 方式快 60~70 倍
  4. 服務可管理:可動態註冊/註銷服務組
  5. 使用 Attribute 方式來標註服務 / 定義服務元數據,對代碼無侵入
  6. 強類型,使用方便(MarshalByrefObject 方式依賴 magic string 來查找服務類)
  7. 內置 IoC 功能,自動管理服務的依賴項
  8. 支持延遲加載類型 / 程序集
  9. 簡單,快速上手
  10. 可經過租約方式管理遠程服務生命期,也可自行管理(MarshalByrefObject 方式不提供遠程服務生命期管理功能)
  11. 支持 .net 2.0


4. 將來計劃

JointCode.Shuttle 是一個很是新穎的框架,功能還不是很完備。儘管做者將會在將來繼續完善現有功能,並推出更多新的功能,但目前仍是存在一些不足,主要包括:

  1. 僅支持 32 位應用程序(x86 目標平臺)
  2. 僅支持 Windows(目前僅支持 .net framework,不支持 mono)
  3. 暫不支持跨 AppDomain 事件
  4. 測試得不夠

 

5. 如何使用 JointCode.Shuttle

若是您對 JointCode.Shuttle 有興趣,請移步前往 這裏,咱們提供了一個簡單的示例來講明如何使用這個框架。

相關文章
相關標籤/搜索