这是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();
})
.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-0/