电竞比分网-中国电竞赛事及体育赛事平台

分享

Orleans 3.0 為我們帶來了什么

 印度阿三17 2019-12-11

作者: 艾心

作者:Reuben Bond,Orleans首席軟件開發(fā)工程師

翻譯:艾心

這是一篇來自Orleans團隊的客座文章,Orleans是一個使用.NET創(chuàng)建分布式應用的跨平臺框架。獲取更多信息,請查看https://github.com/dotnet/orleans。

我們激動的宣布Orleans3.0的發(fā)布。自Orleans2.0以來,加入了大量的改進與修復,以及一些新特性。這些變化是由許多人在生產(chǎn)環(huán)境的大量場景中運行基于Orleans應用程序的經(jīng)驗,以及全球Orleans社區(qū)的智慧和熱情推動的,他們致力于使代碼庫更好、更快、更靈活。非常感謝所有以各種方式為這個版本做出貢獻的人。

自Orleans 2.0以來的關鍵變化:


Orleans 2.0發(fā)布于18個多月前,從那時起Orleans便取得了巨大的進步。以下是自Orleans 2.0以來的重大變化:

  • 分布式ACID事務-多個Grains加入到一個事務中,不管他們的狀態(tài)存儲在哪里

  • 一個新的調(diào)度器,在某些情況下,僅它就可以將性能提升30%以上

  • 一種基于Roslyn代碼分析的新的代碼生成器

  • 重寫集群成員以提升恢復速度

  • 聯(lián)合(Co-hosting)支持

還有很多其他的提升以及修復。

自從致力于開發(fā)Orleans2.0以來,團隊就建立了一套實現(xiàn)或者繼承某些功能的良性循環(huán),包括通用主機、命名選項,在準備將這些功能好成為.NETCore的一部分之前與.NET團隊密切合作、提供反饋和改進“upstream”,在以后的版本中會切換到.NET版本附帶的最終實現(xiàn)。在開發(fā)Orleans 3.0期間,這個循環(huán)繼續(xù)著,在最終發(fā)布為.NET Core 3.0的一部分之前,Orleans 3.0.0-beta1使用了Bedrock代碼。類似的,TCP套接字連接對TLS的支持是作為Orleans 3.0的一部分實現(xiàn)的,并計劃成為.NET Core未來版本的一部分。我們把這種持續(xù)的合作視為是我們對更大的.NET生態(tài)系統(tǒng)的貢獻,這是真正的開源精神。

使用ASP.NET Bedrock替換網(wǎng)絡層


一段時間以來,社區(qū)和內(nèi)部合作伙伴一直要求支持與TLS的安全通信。在3.0版本中,我們引入了TLS支持,可以通過Microsoft.Orleans.Connections.Security包獲取。有關更多信息,請查看TransportLayerSecurity范例。實現(xiàn)TLS支持之所以是一個重大任務要歸因于上一個版本中Orleans網(wǎng)絡層的實現(xiàn)方式:它并不容易適應使用SslStream的方式,而SslStream又是實現(xiàn)TLS最常用的方法。在TLS的推動下,我們著手重寫Orleans的網(wǎng)絡層。

Orleans 3.0使用了一個來自ASP.NET團隊倡議的基于Bedrock項目構(gòu)建的網(wǎng)絡層替換了自己的整個網(wǎng)絡層,Bedrock旨在幫助開發(fā)者構(gòu)建快速的、健壯的網(wǎng)絡客戶端和服務器。

ASP.NET團隊和Orleans團隊一同合作設計了同時支持網(wǎng)絡客戶端和服務端的抽象,這些抽象與傳輸無關,并且可以通過中間件實現(xiàn)定制化。這些抽象允許我們通過配置修改網(wǎng)絡,而不用修改內(nèi)部的、特定于Orleans的網(wǎng)絡代碼。Orleans的TLS支持是作為Bedrock中間件實現(xiàn)的,我們的目的是使之通用,以便與.NET生態(tài)圈的其他人共享。

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

網(wǎng)絡層重寫還包括借助使用MemoryPool<byte>替換我們的自定義緩存池,在進行這項修改時,序列化更多的使用到了Span<T>。有一些代碼路徑之前是依靠調(diào)用BlockingCollection<T>的專有線程進行阻塞,現(xiàn)在使用Channel<T>來異步傳輸消息。這將導致更少的專有線程占用,同時將工作移動到了.NET線程池。

Orleans的核心連接協(xié)議自發(fā)布以來一直都是固定的。在Orleans3.0中,我們已經(jīng)增加了通過協(xié)議協(xié)商(negotiation)逐步更新網(wǎng)絡層的支持。Orleans 3.0中添加的協(xié)議協(xié)商支持未來的功能增強,如定制核心序列化器,同時向后保持兼容性。新的網(wǎng)絡協(xié)議的一個優(yōu)點是支持全雙工Silo到Silo的連接,而不是以前在Silo之間建立的單工連接對。協(xié)議版本可以通過ConnectionOptions.ProtocolVersion進行配置。

通過通用主機進行聯(lián)合托管


Orleans與其他框架共同進行聯(lián)合托管,如ASP.NETCore,得益于.NET通用主機,相同的進程中(使用聯(lián)合托管)現(xiàn)在要比以前容易多了。

下面是一個使用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();
復制代碼

使用通過主機構(gòu)建器,Orleans將與其他托管程序共享同一個服務提供者。這使得這些服務可以訪問Orleans。例如,一個開發(fā)者可以注入IClusterClient或者IGrainFactory到ASP.NETCore MVC Controller中,然后從MVC應用中直接調(diào)用Grains。

這個功能可以簡化你的部署拓撲或者向現(xiàn)有程序中額外添加功能。一些團隊內(nèi)部使用聯(lián)合托管,通過ASP.NET Core健康檢查將Kubernetes活躍性和就緒性探針添加到其Orleans Silo中。

可靠性提高


得益于擴展了Gossip,集群現(xiàn)在可以更快的從失敗中恢復。在以前的Orleans版本中,Silo會向其他Silo發(fā)送成員Gossip信息,指示他們更新成員信息?,F(xiàn)在Gossip消息包括集群成員的版本化、不可變快照。這樣可以縮短Silo加入或者離開集群的收斂時間(例如在更新、擴展或者失敗后),并減輕共享成員存儲上的爭用,從而加快集群轉(zhuǎn)換的速度。故障檢測也得到了改進,利用更多的診斷信息和改進功能以確保更快、更準確的檢測。故障檢測涉及集群中的Silo,他們相互監(jiān)控,每個Silo會定期向其他Silo的子集發(fā)送健康探測。Silo和客戶端現(xiàn)在還主動與已聲明為已失效的Silo的連接斷開,它們將拒絕與此類Silo的連接。

現(xiàn)在,消息錯誤得到了更一致的處理,從而將錯誤提示信息傳播回調(diào)用者。這有助于開發(fā)者更快地發(fā)現(xiàn)錯誤。例如,當消息無法被完全序列化或者反序列化時,詳細的異常信息將會被返回到原始調(diào)用方。

可擴展性增強


現(xiàn)在,Streams可以有自定義的數(shù)據(jù)適配器,從而允許他們以任何格式提取數(shù)據(jù)。這使得開發(fā)人員更好的控制Streamitems在存儲中的表示方式。他還使Stream提供者可以控制如何寫入數(shù)據(jù),從而允許Streams與老的系統(tǒng)和Orleans服務集成。

Grain擴展允許通過自己的通信接口附件新的組件,從而在運行時向Grain添加其他行為。例如,Orleans事務使用Grain擴展對用戶透明的向Grain中添加事務生命周期方法,如“準備”、“提交”和“中止”。Grain擴展現(xiàn)在也可用于Grain服務和系統(tǒng)目標。

現(xiàn)在,自定義事務狀態(tài)可以聲明其在事務中能夠扮演的角色。例如,將事務生命周期事件寫入服務總線隊列的事務狀態(tài)實現(xiàn)不能滿足事務管理器的職責,因為它(該事務狀態(tài)的職責)是只寫的。

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

共同努力


既然Orleans?3.0已經(jīng)發(fā)布,我們也就會將注意力轉(zhuǎn)向未來的版本-我們有一些令人興奮的計劃!快來加入我們在GitHub和Gitter上的社區(qū),幫助我們實現(xiàn)這些計劃。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多