Orleans 3.0 為我們帶來了什麼
原文:https://devblogs.microsoft.com/dotnet/orleans-3-0/
作者:Reuben Bond,Orleans首席軟體開發工程師
翻譯:艾心
這是一篇來自Orleans團隊的客座文章,Orleans是一個使用.NET建立分散式應用的跨平臺框架。獲取更多資訊,請檢視https://github.com/dotnet/orleans。
我們激動的宣佈Orleans3.0的釋出。自Orleans2.0以來,加入了大量的改進與修復,以及一些新特性。這些變化是由許多人在生產環境的大量場景中執行基於Orleans應用程式的經驗,以及全球Orleans社群的智慧和熱情推動的,他們致力於使程式碼庫更好、更快、更靈活。非常感謝所有以各種方式為這個版本做出貢獻的人。
自Orleans 2.0以來的關鍵變化:
Orleans 2.0釋出於18個多月前,從那時起Orleans便取得了巨大的進步。以下是自Orleans 2.0以來的重大變化:
- 分散式ACID事務-多個Grains加入到一個事務中,不管他們的狀態儲存在哪裡
- 一個新的排程器,在某些情況下,僅它就可以將效能提升30%以上
- 一種基於Roslyn程式碼分析的新的程式碼生成器
- 重寫叢集成員以提升恢復速度
- 聯合(Co-hosting)支援
還有很多其他的提升以及修復。
自從致力於開發Orleans2.0以來,團隊就建立了一套實現或者繼承某些功能的良性迴圈,包括通用主機、命名選項,在準備將這些功能好成為.NETCore的一部分之前與.NET團隊密切合作、提供反饋和改進“upstream”,在以後的版本中會切換到.NET版本附帶的最終實現。在開發Orleans 3.0期間,這個迴圈繼續著,在最終釋出為.NET Core 3.0的一部分之前,Orleans 3.0.0-beta1使用了Bedrock程式碼。類似的,TCP套接字連線對TLS的支援是作為Orleans 3.0的一部分實現的,並計劃成為.NET Core未來版本的一部分。我們把這種持續的合作視為是我們對更大的.NET生態系統的貢獻,這是真正的開源精神。
使用ASP.NET Bedrock替換網路層
一段時間以來,社群和內部合作伙伴一直要求支援與TLS的安全通訊。在3.0版本中,我們引入了TLS支援,可以通過Microsoft.Orleans.Connections.Security包獲取。有關更多資訊,請檢視TransportLayerSecurity範例。實現TLS支援之所以是一個重大任務要歸因於上一個版本中Orleans網路層的實現方式:它並不容易適應使用SslStream的方式,而SslStream又是實現TLS最常用的方法。在TLS的推動下,我們著手重寫Orleans的網路層。
Orleans 3.0使用了一個來自ASP.NET團隊倡議的基於Bedrock專案構建的網路層替換了自己的整個網路層,Bedrock旨在幫助開發者構建快速的、健壯的網路客戶端和伺服器。
ASP.NET團隊和Orleans團隊一同合作設計了同時支援網路客戶端和服務端的抽象,這些抽象與傳輸無關,並且可以通過中介軟體實現定製化。這些抽象允許我們通過配置修改網路,而不用修改內部的、特定於Orleans的網路程式碼。Orleans的TLS支援是作為Bedrock中介軟體實現的,我們的目的是使之通用,以便與.NET生態圈的其他人共享。
儘管這項工作是的動力是啟用TLS支援,但是在夜間負載測試中,我們看到了平均吞吐量提升了大約30%。
網路層重寫還包括藉助使用MemoryPool<byte>替換我們的自定義快取池,在進行這項修改時,序列化更多的使用到了Span<T>。有一些程式碼路徑之前是依靠呼叫BlockingCollection<T>的專有執行緒進行阻塞,現在使用Channel<T>來非同步傳輸訊息。這將導致更少的專有執行緒佔用,同時將工作移動到了.NET執行緒池。
Orleans的核心連線協議自發布以來一直都是固定的。在Orleans3.0中,我們已經增加了通過協議協商(negotiation)逐步更新網路層的支援。Orleans 3.0中新增的協議協商支援未來的功能增強,如定製核心序列化器,同時向後保持相容性。新的網路協議的一個優點是支援全雙工Silo到Silo的連線,而不是以前在Silo之間建立的單工連線對。協議版本可以通過ConnectionOptions.ProtocolVersion進行配置。
通過通用主機進行聯合託管
Orleans與其他框架共同進行聯合託管,如ASP.NETCore,得益於.NET通用主機,相同的程序中(使用聯合託管)現在要比以前容易多了。
下面是一個使用UseOrleans將Orleans和ASP.NETCore一起新增到主機的例子:
1 var host = new HostBuilder() 2 .ConfigureWebHostDefaults(webBuilder => 3 { 4 // Configure ASP.NET Core 5 webBuilder.UseStartup<Startup>(); 6 }) 7 .UseOrleans(siloBuilder => 8 { 9 // Configure Orleans 10 siloBuilder.UseLocalHostClustering(); 11 }) 12 .ConfigureLogging(logging => 13 { 14 /* Configure cross-cutting concerns such as logging */ 15 }) 16 .ConfigureServices(services => 17 { 18 /* Configure shared services */ 19 }) 20 .UseConsoleLifetime() 21 .Build(); 22 23 // Start the host and wait for it to stop. 24 await host.RunAsync();
使用通過主機構建器,Orleans將與其他託管程式共享同一個服務提供者。這使得這些服務可以訪問Orleans。例如,一個開發者可以注入IClusterClient或者IGrainFactory到ASP.NETCore MVC Controller中,然後從MVC應用中直接呼叫Grains。
這個功能可以簡化你的部署拓撲或者向現有程式中額外新增功能。一些團隊內部使用聯合託管,通過ASP.NET Core健康檢查將Kubernetes活躍性和就緒性探針新增到其Orleans Silo中。
可靠性提高
得益於擴充套件了Gossip,叢集現在可以更快的從失敗中恢復。在以前的Orleans版本中,Silo會向其他Silo傳送成員Gossip資訊,指示他們更新成員資訊。現在Gossip訊息包括叢集成員的版本化、不可變快照。這樣可以縮短Silo加入或者離開叢集的收斂時間(例如在更新、擴充套件或者失敗後),並減輕共享成員儲存上的爭用,從而加快叢集轉換的速度。故障檢測也得到了改進,利用更多的診斷資訊和改進功能以確保更快、更準確的檢測。故障檢測涉及叢集中的Silo,他們相互監控,每個Silo會定期向其他Silo的子集傳送健康探測。Silo和客戶端現在還主動與已宣告為已失效的Silo的連線斷開,它們將拒絕與此類Silo的連線。
現在,訊息錯誤得到了更一致的處理,從而將錯誤提示資訊傳播回撥用者。這有助於開發者更快地發現錯誤。例如,當訊息無法被完全序列化或者反序列化時,詳細的異常資訊將會被返回到原始呼叫方。
可擴充套件性增強
現在,Streams可以有自定義的資料介面卡,從而允許他們以任何格式提取資料。這使得開發人員更好的控制Streamitems在儲存中的表示方式。他還使Stream提供者可以控制如何寫入資料,從而允許Streams與老的系統和Orleans服務整合。
Grain擴充套件允許通過自己的通訊介面附件新的元件,從而在執行時向Grain新增其他行為。例如,Orleans事務使用Grain擴充套件對使用者透明的向Grain中新增事務生命週期方法,如“準備”、“提交”和“中止”。Grain擴充套件現在也可用於Grain服務和系統目標。
現在,自定義事務狀態可以宣告其在事務中能夠扮演的角色。例如,將事務生命週期事件寫入服務匯流排佇列的事務狀態實現不能滿足事務管理器的職責,因為它(該事務狀態的職責)是隻寫的。
由於預定義的放置策略現在可以公開訪問,因此在配置期間可以替換任何放置控制器。
共同努力
既然Orleans 3.0已經發布,我們也就會將注意力轉向未來的版本-我們有一些令人興奮的計劃!快來加入我們在GitHub和Gitter上的社群,幫助我們實現這些計劃。