Orleans 3.0 为我们带来了什么

原文:https://devblogs.microsoft.com/dotnet/orleans-3-0/

作者:Reuben BondOrleans首席软件开发工程师

翻译:艾心

这是一篇来自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一起添加到主机的例子:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程的同步与互斥

现代操作系统采用多道程序设计机制&#xff0c;多个进程可以并发执行&#xff0c;CPU在进程之间来回切换&#xff0c;共享某些资源&#xff0c;提高了资源的利用率&#xff0c;但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题。如果对并发进程的调度不…

缓存击穿/穿透/雪崩

缓存击穿/穿透/雪崩Intro使用缓存需要了解几个缓存问题&#xff0c;缓存击穿、缓存穿透以及缓存雪崩&#xff0c;需要了解它们产生的原因以及怎么避免&#xff0c;尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题。缓存击穿一般的缓存系统&#xff0c;都是按照…

临界区、互斥量、信号量、事件的区别

四种进程或线程同步互斥的控制方法&#xff1a; 1、临界区:通过对多线程的串行化来访问公共资源或一段代码&#xff0c;速度快&#xff0c;适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4…

99%的人不知道搜索引擎的6个技巧

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约900字&#xff0c;预计阅读时间1分钟今天看了一期seo优化的视频&#xff0c;其中就有这么一篇关于百度搜索的几个小技巧&#xff0c;这里整理出来&#xff0c;…

用信号量解决进程的同步与互斥

转自&#xff1a;http://www.cnblogs.com/whatbeg/p/4435286.html 现代操作系统采用多道程序设计机制&#xff0c;多个进程可以并发执行&#xff0c;CPU在进程之间来回切换&#xff0c;共享某些资源&#xff0c;提高了资源的利用率&#xff0c;但这也使得处理并发执行的多个进程…

扎心了,程序员2017到2019经历了什么?

刷爆朋友圈的2017-2019到底是什么梗&#xff1f;只剩下33天了&#xff0c;就到2020年了最后一批90后&#xff0c;马上就要30了&#xff1f;一到年底&#xff0c;就会陷入回忆和比较中近几日&#xff0c;网友开始将2017年和2019年进行对比&#xff0c;不少人晒出了自己在17年和1…

【.NETCore 3】Ids4 ║ 统一角色管理(上)

前言书接上文&#xff0c;咱们在上周&#xff0c;通过一篇《思考》 性质的文章&#xff0c;和很多小伙伴简单的讨论了下&#xff0c;如何统一同步处理角色的问题&#xff0c;众说纷纭&#xff0c;这个我一会儿会在下文详细说到&#xff0c;而且我最终也定稿方案了。所以今天咱们…

操作系统死锁详解

一、死锁的定义 死锁是两个或两个以上的进程中的每一个都在等待其中另一个进程释放资源而被封锁&#xff0c;它们都无法向前推进&#xff0c;这种现象称为死锁。 二、产生死锁的主要原因 &#xff08;1&#xff09; 因为系统资源不足。 &#xff08;2&#xff09; 进程运行推进…

.NET Core 3.0 使用Nswag生成Api文档和客户端代码

摘要在前后端分离、Restful API盛行的年代&#xff0c;完美的接口文档&#xff0c;成了交流的纽带。在项目中引入Swagger &#xff08;也称为OpenAPI&#xff09;&#xff0c;是种不错的选择&#xff0c;它可以让接口数据可视化。下文将会演示利用Nswag如何生成Api文档利用NSwa…

什么是虚拟内存?

虚拟内存是计算机系统内存管理的一种技术。 它使得应用程序认为它拥有连续的可用的内存&#xff08;一个连续完整的地址空间&#xff09;&#xff0c;而实际上&#xff0c;它通常是被分隔成多个物理内存碎片&#xff0c;还有部分暂时存储在外部磁盘存储器上&#xff0c;在需要…

深入研究 Angular 和 ASP.NET Core 3.0

本文要点&#xff1a;可以把多个 Angular 应用程序集成到 ASP.NET 网站中把 Angular 代码打包成 Web 组件是引导 Angular 应用程序的好方法可以把用 Angular 编写的 Web 组件轻松地集成到 ASP.NET 视图中把 Angular 解决方案构造成 Angular 应用程序的集合以实现更好的代码重用…

操作系统内存管理--简单、页式、段式、段页式

一、内存管理的目的和功能 内存一直是计算机系统中宝贵而又紧俏的资源&#xff0c;内存能否被有效、合理地使用&#xff0c;将直接影响到操作系统的性能。此外&#xff0c;虽然物理内存的增长现在达到了N个GB&#xff0c;但比物理内存增长还快的是程序&#xff0c;所以无论物理…

网易裁员背后,芸芸众生,相煎何急

十一月初拖家带口去了上海&#xff0c;到了著名的城隍庙参观&#xff0c;无意中看到了一个仅出现在历史书上的古老物件“西洋镜”&#xff0c;仿佛跨越百年&#xff0c;来到那个如裹脚布般冗长而乏味的古老年代&#xff0c;看到了一群有一群卑微的小民在生活的裹挟之下&#xf…

LRU和LFU的区别

一、概念介绍 LRU和LFU都是内存管理的页面置换算法。 LRU&#xff0c;即&#xff1a;最近最少使用淘汰算法&#xff08;Least Recently Used&#xff09;。LRU是淘汰最长时间没有被使用的页面。 LFU&#xff0c;即&#xff1a;最不经常使用淘汰算法&#xff08;Least Frequentl…

网速和带宽的区别

为了弄清网速和带宽直接的区别&#xff0c;我们首先需要明白两个概念&#xff1a; Byte&#xff08;字节&#xff09;和bit&#xff08;位&#xff09;。 字节是计算机中用于计算存储容量的一种计量单位&#xff0c;简称B。一个字节由8个位组成&#xff0c;即&#xff1a; 1Byt…

.NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

更新记录&#xff1a;-- 2019-11-26 增加Docker容器日志系列文章近期在学习Kubernetes&#xff0c;基于之前做笔记的习惯&#xff0c;已经写了一部分文章&#xff0c;因此给自己立一个flag&#xff1a;完成这个《.NET Core on K8S学习实践》系列文章&#xff01;这个系列会持续…

ASP.NET Core gRPC 使用 Consul 服务注册发现

一. 前言gRPC 在当前最常见的应用就是在微服务场景中&#xff0c;所以不可避免的会有服务注册与发现问题&#xff0c;我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心&#xff0c;本文主要介绍Consul。二. Consul 介绍Consul是一种服务网络解决方案&a…

网络时延——发送时延和传播时延

一、时延的定义 时延是指一个报文或分组从一个网络的一端传送到另一个端所需要的时间。它包括了发送时延&#xff0c;传播时延&#xff0c;处理时延&#xff0c;排队时延。 时延 发送时延 传播时延 处理时延 排队时延 一般&#xff0c;发送时延与传播时延是我们主要考虑的。…

Excel催化剂插件功能修复与更新汇总篇之十

在半年时间里&#xff0c;自己使用过程中&#xff0c;发现的一些小bug&#xff0c;更新了一下&#xff0c;也追加了一些自定义函数&#xff0c;不成系统&#xff0c;就单独放在修复与更新系列中。一、第24波-批量发送邮件并指点不同附件不同变量Excel催化剂功能第24波-批量发送…

OSI/RM 开放系统互联参考模型

开放式系统互联通信参考模型&#xff08;即&#xff1a;Open System Interconnection Reference Model&#xff0c;简称为OSI模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;一个试图使各种计算机在世界范围内互连为网络的标准框架。 OSI的七层体…