这是Orleans团队的帖子。Orleans是用于使用.NET构建分布式应用程序的跨平台框架。有关更多信息,请参见
这是Orleans团队的帖子。Orleans是用于使用.NET构建分布式应用程序的跨平台框架。有关更多信息,请参见 https://github.com/dotnet/orleans 。git
咱们很高兴宣布Orleans 3.0版本。自Orleans 2.0以来,进行了大量改进和修复,并提供了一些新功能。这些变化是由许多人在各类各样的场景和环境中在生产中运行基于Orleans的应用程序的经验所驱动的,也是由全球Orleans社区的聪明才智和热情所致,他们一直致力于使代码库更好,更快,更多。灵活。很是感谢以各类方式为该版本作出贡献的全部人!github
Orleans2.0于18个月前发布,此后Orleans取得了长足的进步。自2.0版以来的一些标题更改是:web
以及许多其余许多改进和修复。安全
自开发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生态系统的贡献。服务器
一段时间以来,不管是社区仍是内部合做伙伴,对使用TLS进行安全通讯的支持一直是一个主要问题。在3.0版本中,咱们引入了TLS支持,可经过Microsoft.Orleans.Connections.Security包得到该支持。有关更多信息,请参见TransportLayerSecurity示例。网络
因为如何实现Orleans早期版本中的网络层,实现TLS支持是一项艰巨的工做:没法轻松地使用来支持SslStream,这是实现TLS的最多见方法。以TLS为动力,咱们踏上了重写Orleans网络层的旅程。框架
Orleans3.0取代了整个网络层,该层基于ASP.NET团队的计划Project Rock之上。Bedrock的目标是帮助开发人员构建快速,强大的网络客户端和服务器。asp.net
ASP.NET团队和Orleans团队一块儿设计支持网络客户端和服务器,与传输无关的抽象,而且可使用中间件进行自定义。这些抽象使咱们可以经过配置更改网络传输,而无需修改内部或特定于Orleans的联网代码。Orleans的TLS支持做为基岩中间件实现,咱们的目的是使之通用,以即可以与.NET生态系统中的其余人共享。异步
尽管这项工做的推进力是启用TLS支持,但在咱们的夜间负载测试中,咱们平均看到吞吐量大约提升了30%。分布式
网络层的重写还涉及依赖于替换咱们的自定义缓冲池,MemoryPool
自最初发布以来,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团队