1. 程式人生 > >【翻譯】Orleans 3.0 釋出

【翻譯】Orleans 3.0 釋出

這是Orleans團隊的帖子。Orleans是用於使用.NET構建分散式應用程式的跨平臺框架。有關更多資訊,請參見 https://github.com/dotnet/orleans 。

我們很高興宣佈Orleans 3.0版本。自Orleans 2.0以來,進行了大量改進和修復,並提供了一些新功能。這些變化是由許多人在各種各樣的場景和環境中在生產中執行基於Orleans的應用程式的經驗所驅動的,也是由全球Orleans社群的聰明才智和熱情所致,他們一直致力於使程式碼庫更好,更快,更多。靈活。非常感謝以各種方式為該版本做出貢獻的所有人!

自Orleans2.0以來的重大變化

Orleans2.0於18個月前釋出,此後Orleans取得了長足的進步。自2.0版以來的一些標題更改是:

  • 分散式ACID事務-無論狀態儲存在何處,多個顆粒都可以加入事務
  • 一個新的排程程式,僅在某些情況下,其效能就提高了30%以上
  • 基於Roslyn程式碼分析的新程式碼生成器
  • 重寫叢集成員資格以提高恢復速度
  • (Co-hosting)支援

以及許多其他許多改進和修復。

自開發Orleans 2.0以來,該團隊與.NET團隊密切協作,建立了一個實現或整合某些功能(例如通用主機,命名選項)的良性迴圈,然後才準備將這些功能納入.NET。核心版本,“上游”提供反饋和改進,在更高版本中,切換到.NET版本附帶的最終實現。在Orleans 3.0的開發過程中,這個週期一直持續著,直到Orleans 3.0.0-beta1最終將其作為.NET 3.0的一部分使用之前,都使用了基岩程式碼。同樣,在TCP套接字連線上對TLS的支援是作為Orleans 3.0的一部分實現的,並且打算成為.NET Core未來版本的一部分。我們本著開放源源不斷的精神,將這種持續的合作視為對更大的.NET生態系統的貢獻。

使用用ASP.NET Bedrock替換網路層

一段時間以來,無論是社群還是內部合作伙伴,對使用TLS進行安全通訊的支援一直是一個主要問題。在3.0版本中,我們引入了TLS支援,可通過Microsoft.Orleans.Connections.Security包獲得該支援。有關更多資訊,請參見TransportLayerSecurity示例。

由於如何實現Orleans早期版本中的網路層,實現TLS支援是一項艱鉅的工作:無法輕鬆地使用來支援SslStream,這是實現TLS的最常見方法。以TLS為動力,我們踏上了重寫Orleans網路層的旅程。

Orleans3.0取代了整個網路層,該層基於ASP.NET團隊的計劃Project Rock之上。Bedrock的目標是幫助開發人員構建快速,強大的網路客戶端和伺服器。

ASP.NET團隊和Orleans團隊一起設計支援網路客戶端和伺服器,與傳輸無關的抽象,並且可以使用中介軟體進行自定義。這些抽象使我們能夠通過配置更改網路傳輸,而無需修改內部或特定於Orleans的聯網程式碼。Orleans的TLS支援作為基岩中介軟體實現,我們的目的是使之通用,以便可以與.NET生態系統中的其他人共享。

儘管這項工作的推動力是啟用TLS支援,但在我們的夜間負載測試中,我們平均看到吞吐量大約提高了30%。

網路層的重寫還涉及依賴於替換我們的自定義緩衝池,MemoryPool並且在進行此更改時,序列化現在可以利用的更多優勢Span。以前依賴於通過專用執行緒呼叫BlockingCollection進行阻止的某些程式碼路徑現在Channel用於非同步傳遞訊息。這樣可以減少專用執行緒的數量,從而將工作移至.NET執行緒池。

自最初發布以來,Orleans的核心線協議一直保持不變。在Orleans 3.0中,我們增加了對通過協議協商逐步升級網路協議的支援。Orleans 3.0中新增的協議協商支援可實現將來的增強功能,例如自定義核心序列化程式,同時保持向後相容性。新網路協議的一個好處是支援全雙工筒倉到筒倉的連線,而不是以前在筒倉之間建立的單工連線對。協議版本可以通過進行配置ConnectionOptions.ProtocolVersion。

通過通用主機共同託管

現在,通過.NET Generic Host可以比以前更輕鬆地在同一過程中與其他框架(如ASP.NET Core)共同託管Orleans 。

這是使用以下命令將Orleans和ASP.NET Core一起新增到主機的示例UseOrleans:

var host = new HostBuilder()
  .ConfigureWebHostDefaults(webBuilder =>
  {
    // Configure ASP.NET Core
    webBuilder.UseStartup<Startup>();
  })
  .UseOrleans(siloBuilder =>
  {
    // Configure Orleans
    siloBuilder.UseLocalHostClustering();
  })
  .ConfigureLogging(logging =>
  {
    /* Configure cross-cutting concerns such as logging */
  })
  .ConfigureServices(services =>
  {
    /* Configure shared services */
  })
  .UseConsoleLifetime()
  .Build();

// Start the host and wait for it to stop.
await host.RunAsync();

使用通用主機生成器,Orleans將與其他託管服務共享服務提供商。這將使這些服務可以訪問Orleans。例如,開發人員可以將其插入IClusterClient或IGrainFactory插入ASP.NET Core MVC控制器中,並直接從其MVC應用程式呼叫粒度。

此功能可用於簡化部署拓撲或向現有應用程式新增其他功能。一些團隊在內部使用聯合託管,通過ASP.NET Core Health Checks將Kubernetes的活躍性和就緒性探針新增到他們的Orleans silos。

可靠性提高

現在,得益於擴充套件了Gossip,群集從故障中恢復的速度更快。在以前的Orleans版本中,silos 會向其他silos 傳送成員Gossip訊息,指示他們更新成員資訊。八卦訊息現在包括叢集成員身份的版本化,不變的快照。這樣可以縮短silos 加入或離開集群后的收斂時間(例如,在升級,擴充套件或發生故障後),並減輕共享成員儲存上的爭用,從而加快叢集轉換的速度。故障檢測也得到了改進,具有更多的診斷訊息和改進功能以確保更快,更準確的檢測。故障檢測涉及群集中的silos ,這些silos 相互協作監視,每個向其他silos的子集傳送定期執行狀況探測。

現在,可以更一致地處理訊息錯誤,從而將提示錯誤傳播回撥用者。這有助於開發人員更快地發現錯誤。例如,當訊息無法完全序列化或反序列化時,詳細的異常將傳播回原始呼叫方。

增強的可擴充套件性

Streams 可以具有自定義資料介面卡,從而允許它們以任何格式提取資料。這使開發人員可以更好地控制Streamitems在儲存中的表示方式。它還使Stream提供者可以控制如何寫入資料,從而允許Streams與老系統和Orleans服務整合。

Grain擴充套件允許通過自己的通訊介面附件新的元件,從而在執行時向Grain新增其他行為。例如,Orleans事務使用Grain擴充套件對使用者透明的向Grain中新增事務生命週期方法,如“準備”、“提交”和“中止”。Grain擴充套件現在也可用於Grain服務和系統目標。

現在,自定義事務狀態可以宣告其在事務中能夠扮演的角色。例如,將事務生命週期事件寫入服務匯流排佇列的事務狀態實現不能滿足事務管理器的職責,因為它(該事務狀態的職責)是隻寫的。

預定義的放置策略現在可以公開訪問,因此在配置期間可以替換任何放置控制器。

共同努力

既然Orleans3.0已經發布,我們就將注意力轉向未來的版本-我們有一些令人興奮的計劃!快來加入我們在GitHub和Gitter上熱情友好的社群,幫助我們實現這些計劃。

Orleans團隊

概要

翻譯:https://devblogs.microsoft.com/dotnet/orleans-3