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上的社区,帮助咱们实现这些计划。

相关文章
相关标签/搜索