Orleans 3.0 为我们带来了什么

这是一篇来自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();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgzf.html