Orleans 3.0 爲咱們帶來了什麼

 

原文:https://devblogs.microsoft.com/dotnet/orleans-3-0/git

做者:Reuben BondOrleans首席軟件開發工程師github

翻譯:艾心web

這是一篇來自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上的社區,幫助咱們實現這些計劃。

相關文章
相關標籤/搜索