.NET分布式大规模计算利器-Orleans(一)

写在前面

Orleans是基于Actor模型思想的.NET领域的框架,它提供了一种直接而简单的方法来构建分布式大规模计算应用程序,而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans,当时公司的交易系统采用的架构就是基于Orleans框架的,其展现出来的高性能、高并发以及惊人的稳定性深深地吸引了我,也让我认识到了传统三层无状态架构的缺陷。本文主要关注Orleans的思想基础,Actor模型及其应用。

Orleans思想基础:Actor模型

传统三层无状态架构的缺陷

在讨论Actor模型之前,我们可以先讨论一下传统三层架构在当前高并发环境中所面临的尴尬境遇。

三层架构包括表示层、业务逻辑层或者叫做中间层、数据访问层(也就是存储层),其架构图如下所示:

640?wx_fmt=png

正如我们在实践中所知道的那样,中间层和数据访问层在伸缩性方面有着很大的限制,同时存储层常常会成为系统的瓶颈,这就意味着整套系统也会因为存储层的限制而变得低效。通常的做法是在中间层与存储层中间加一层缓存逻辑出来,以提升系统性能,但是很快就会遇到存储层与缓存层的数据一致性问题,这无疑为开发人员和运维人员增加了额外的工作量。

试想一下,如果我们中间层本身就携带着状态或者简单来说中间层与缓存层是合二为一的,那么我们的系统性能是不是就提升了一个级别,答案是肯定的。那么该如何去做呢?那就是我们需要考虑使用另外一套系统设计架构:Actor模型。

Actor模型

Actor模型允许建立一个有状态的中间层,其内存级的读写性能和特定于相关领域的业务实体行为,确保了系统的高性能以及数据的一致性。Actor模型天然的拥有着面向对象的程序设计功能。在实践中我们应该把主要精力放到组件之间的消息传递,而不是对象的属性和内部行为。

Actor模型作为一种用于处理并发计算的数学模型,它将Actor对象用作并发计算的通用基元,它也是一种重要的软件设计思想,它在架构、设计、实现以及组件之间的消息传递方面有着非常好的应用,也更好的发挥了多核计算机的潜力。通过创建新的Actor对象,可以在计算操作的生命周期中以抽象方式提高系统的分布性。

Actor作为一种计算实体,它会对收到的消息做出回应,并且还会在内部做其他一些事情:

  • 向其他Actor对象发送消息

  • 创建一定数量的新Actor对象

  • 设置对下一条消息做出的回应方式

下图展示了多种Actor模型的交互示例

640?wx_fmt=png

Actor模型具有以下特点:

  • 通过异步消息方式进行通信:使消息就像从一个Actor对象传输到了另一个Actor对象(通过MailBox交互,这跟CSP的通信模式完全不同,有兴趣的朋友可以自行查阅)

  • 状态机:Actor模型支持有限状态机

  • 独立性:多个Actor对象之间不会共享状态

  • 无锁的并发处理方式:由于Actor不会共享状态,且在同一时刻只处理一条消息,因而无需使用锁策略,这极大的提高了Actor系统的性能

  • 并行性:当顶级Actor将任务分拆后发送给多个下级Actor后,可以使用Actor模型的并行处理方式

  • 位置透明:可以使用抽象引用表示Actor对象的地址

  • Future/Promise对象:这是对异步操作的发送与接收方式,以表示异步操作的完成结果

Orleans对Actor的应用

Actor平台(例如Erlang和Akka)在简化分布式系统编程方面向前迈了一步。但是,由于提供的抽象和系统服务的水平相对较低,它们仍然使开发人员承担着许多分布式系统的复杂性。主要包括开发用于管理Actor的生命周期,处理分布式簇,处理Actor的失败和恢复,放置Actor以及由此产生的管理分布式资源的应用程序代码。要为应用程序中的这些问题构建正确的解决方案,这就开发人员的要求就非常高了,必须是分布式系统专家级别的。

为了减少这些问题的发生,Orleans框架引入了虚拟Actor的新型抽象,它解决了许多复杂的分布式系统问题,例如可靠性和分布式资源管理,从而使开发人员摆脱了那些麻烦。同时,Orleans运行时使应用程序能够获得高性能,可靠性和可伸缩性。

Orleans对Actor的实现特点:

  • Orleans Actor无处不在:无法明确创建或销毁它。它的生命周期超越了其任何内存对象的生命周期,因此也超越了任何特定服务器的生命周期。

  • Orleans Actor会自动实例化:如果没有Actor的内存实例,则发送给Actor的消息会促使在可用服务器上创建一个新实例。作为运行时资源管理的一部分,将自动回收未使用的Actor实例。Actor永远不会失败:如果服务器崩溃了,下一条发送给运行在故障服务器上的Actor的消息将会促使Orleans自动在另一台服务器上重新实例化该Actor ,从而无需应用程序来监督和显式重新创建已经挂掉的Actor。

  • Actor实例的位置对于应用程序代码是透明的,从而大大简化了编程。

  • Orleans可以自动创建同一个无状态Actor的多个实例,从而无缝扩展热门Actor。

虚拟Actor的引入,相当于为开发者提供了一个虚拟的内存空间,使开发人员可以调用系统中的任何角色,无论它是否存在于内存中。虚拟化依赖于从虚拟角色映射到当前运行的物理实例的间接寻址。运行时通过一个分布式目录支持间接寻址,该目录将Actor标识映射到其当前物理位置。Orleans通过使用该映射的本地缓存来最小化间接寻址的运行时开销。这个策略被证明是非常有效的。在我们的生产服务中,缓存命中率通常远远超过90%。

下图展示了微软对Orleans的应用

640?wx_fmt=jpeg

 

参考链接:https://www.microsoft.com/en-us/research/project/orleans-virtual-actors/

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

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

相关文章

吉哥系列故事——恨7不成妻(数位 DP)

吉哥系列故事——恨7不成妻 ∑i1n(presuc)2∑i1npre2suc22presucnpre2∑suc22pre∑suc\sum_{i 1} ^{n}(pre suc) ^ 2\\ \sum_{i 1} ^{n} pre ^ 2 suc ^ 2 2 \times pre \times suc\\ n \times pre ^ 2 \sum suc ^ 2 2 \times pre \sum suc\\ i1∑n​(presuc)2i1∑n​pre…

Hibernate与MyBatis对比

1、Hibernate与MyBatis简单介绍 Hibernate 是当前最流行的O/R mapping框架,它来自于 sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网:http://www.mybat…

Hive-DML详解(超详细)

文章目录 前言HiveQL的数据操作语言(DML)1. 插入数据1.1 直接插入固定值1.2 插入查询结果 2. 更新数据3. 删除数据3.1 删除整个分区 4. 查询数据4.1 基本查询4.2 条件筛选4.3 聚合函数 总结 前言 本文将介绍HiveQL的数据操作语言(DML&#x…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份,受限于HTTP无状态的特性,应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端,客户端在接下来的请求中携带通行证,然后服务端通过校验该通行证…

P5175 数列(矩阵快速幂)

P5175 数列 anb(xan−1yan−2)2x2an−12y2an−222xyan−1an−2x2an−12y2an−222xyan−2(xan−2yan−3)x2an−12y2an−222xy(xan−22yan−2an−3)a_n ^ b \left(x \times a_{n - 1} y \times a_{n - 2}\right) ^ 2\\ x ^ 2 \times a_{n - 1} ^ 2 y ^ 2 \times a_{n - 2} ^ 2…

Spring bean 的初始化

先mark: https://www.cnblogs.com/yxh1008/p/6012230.html Bean的多种初始化、destory方法执行顺序 https://segmentfault.com/a/1190000014105687 https://blog.csdn.net/caihaijiang/article/details/8629725 Spring bean的初始化过程 https://www.jianshu.com…

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说, 作为开发人员经常需要根据条件灵活查询数据库,不管你是用rawsql 还是EFCore, 以下类似伪代码大家都可能遇到:特别是在大数据产品或者物联网产品中,字段甚多;if/else 写到死,一边写…

Spring bean 初始化顺序

InitializingBean, init-method 和 PostConstruct 1、概述 从接口的名字上不难发现,InitializingBean 的作用就是在 bean 初始化后执行定制化的操作。 Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特…

不要666升级版(数位DP,三次方和)

不要666升级版 ∑(presuc)2npre22pre∑suc∑suc2\sum(pre suc) ^ 2\\ n \times pre ^ 2 2 \times pre \sum suc \sum suc ^ 2\\ ∑(presuc)2npre22pre∑suc∑suc2 ∑(presuc)3∑(pre33pre2suc3presuc2suc3)npre33pre2∑suc3pre∑suc2∑suc3\sum (pre suc) ^ 3\\ \sum \left…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演,主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序,如果您是游戏…

Spring AOP实现原理

先说结论: Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时,采用JDK动态代理,否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心,整个软件系统由系列相互依赖的对象所组成&#xff0c…

J. Product of GCDs(莫比乌斯反演)(2021牛客暑期多校训练营2)

Product of GCDs ∏d1nd∑[gcd⁡(s1d,s2d,…,skd)1]∏d1nd∑i1ndμ(i)Cf[id]k\prod_{d 1} ^{n} d ^{\sum[\gcd(\frac{s_1}{d}, \frac{s_2}{d}, \dots, \frac{s_k}{d}) 1]}\\ \prod_{d 1} ^{n} d ^{\sum\limits_{i 1} ^{\frac{n}{d}} \mu(i) C_{f[id]} ^{k}}\\ d1∏n​d∑[g…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者,推出了一套免费的教程视频。这套视频名为 Python for Beginners,该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解,在课程中加…

徒手实现Spring的IOC

Mark https://www.jianshu.com/p/9fe5a3c25ab6 https://juejin.im/post/5abe75f351882577b45f2336 https://blog.csdn.net/u012373815/article/details/74937913 https://xilidou.com/2018/01/08/spring-ioc/ IOC原理介绍: http://www.importnew.com/14751.htm…

HDU6956-Pass!(2021杭电多校一)(BSGS)

Pass! f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2)f(1) 0, f(2) n - 1, f(t) (n - 2) \times f(t - 1) (t - 1) \times f(t - 2)f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2),考虑对通项两边同时加一个xf(t−1)x \times f(t - 1)xf(t−1)。 可以得到f(t…

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目,我们今天先推荐6个开源项目;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于…

spring四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。 spring提出了依赖注入的思想,即依赖不由程序员控制,而是通过spring…

3085 吃遍赴丝码(分治)

3085 吃遍赴丝码 给定一个长度为nnn的数组,求∑i1n∑jin(j−i1)min{ai,…,aj}max{ai,…,aj}\sum\limits_{i 1} ^{n} \sum\limits_{j i} ^{n} (j - i 1) \times min\{a_i, \dots, a_j\} \times max\{a_i, \dots, a_j\}i1∑n​ji∑n​(j−i1)min{ai​,…,aj​}max…

聊聊高并发下库存加减那些事儿——“异步扣减库存”

聊聊高并发下库存加减那些事儿不定期福利发放哦聊聊高并发下库存加减那些事儿背景一般在日常开发中经常会遇到打折促销,秒杀活动,就如拼多多最近的4999抢券买爱疯11促销活动,毕竟谁的钱也不是大风刮来的,有秒杀有促销必定带来大量…

什么是MVC

什么是MVC? MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。 用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面&#xf…