写在前面

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

Orleans思想基础:Actor模型

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

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

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

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

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

Actor模型

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

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

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

  • 向其他Actor对象发送消息
  • 创建一定数量的新Actor对象
  • 设置对下一条消息做出的回应方式

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

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的应用

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

原文地址:https://www.cnblogs.com/edison0621/

Orleans 分布式 计算框架-Actor模型的一种实现相关推荐

  1. mysql逻辑架构连接池_GitHub - zzjzzb/ycsocket: 基于swoole的socket框架,支持协程版MySQL、Redis连接池、Actor模型...

    ycsocket 基于 swoole 和 swoole_orm 的 websocket 框架,各位可以自己扩展到 TCP/UDP,HTTP. 在ycsocket 中,采用的是全协程化,全池化的数据库. ...

  2. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  3. Hadoop详解(六):MapReduce计算框架详解

    1. Hadoop MapReduce简介 Hadoop MapReduce是一个使用简便的软件框架,是Google云计算模型MapReduce的Java开源实现,基于它写出来的应用程序能够运行在由上 ...

  4. 【Akka】Actor模型探索

    Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们采取了" ...

  5. 游戏服务器为什么选用Actor模型,《百万在线》给你答案

    游戏服务器需要承载很多玩家,开发者需要选择合理的架构.Actor模型是一种常用的游戏服务端架构模型,在选用Skynet.Erlang方案的公司中广泛应用. 从硬件角度看待架构划分 游戏服务端选用的抽象 ...

  6. 腾讯高性能图计算框架Plato及其算法应用

    作者:hunteryu,腾讯 WXG 后台开发工程师 Plato 简介 腾讯高性能图计算框架 Plato 图作为一种表示和分析大数据的有效方法,已成为社交网络.推荐系统.网络安全.文本检索和生物医疗等 ...

  7. Java并发编程实战~Actor 模型

    Hello Actor 模型 Actor 模型本质上是一种计算模型,基本的计算单元称为 Actor,换言之,在 Actor 模型中,所有的计算都是在 Actor 中执行的.在面向对象编程里面,一切都是 ...

  8. 并发机制:CSP vs Actor模型以及Golang实现

    作者:花与火山石 原文链接:https://blog.csdn.net/qq_32702033/article/details/104415434 CSP & Actor Model 本文将简 ...

  9. 深度学习计算框架综述(二)计算框架的组成与设计要点

    本章主要介绍一个通用计算框架主要包含哪几个模块,以及这些模块的设计要点,建议大家阅读本章前,了解一下Protocol Buffer 以及 FlatBuffer 的概念及基本用法. 首先,我们先分析一下 ...

最新文章

  1. 如何获取本地安装的Python模块列表?
  2. python subprocess-更优雅的创建子进程
  3. WinForm中使用Excel控件
  4. Docker 是什么,组成
  5. linux脚本vrrp_script,keepalived 的 vrrp_script
  6. ajax提交整个form表单
  7. 450g吐司烘烤温度_这不可能是吐司!不,是的
  8. 算法习题---线性表之数组实现循环移动
  9. python——extend用新序列扩展其他列表
  10. 逆波兰表达式java_采用JAVA对逆波兰表达式解析浅见
  11. 用腾讯云轻量搭建 TeamSpeak 服务器
  12. myd导入mysql_数据库是.frm,.myd,myi备份如何导入mysql
  13. 交换机下接路由器lan还是wan_无线路由器wan口未连接如何解决【解决方法】
  14. java黄金分割点游戏_结对编程--黄金分割点游戏
  15. Qt----Qt控制LED
  16. postman(一)常用的Tests方法
  17. 我的世界java版骨头指令_我的世界:如何调出“啃骨头”隐藏皮肤?1个没人知道的mc彩蛋...
  18. 这么说IBIS模型,你应该就懂了
  19. 编译原理之词法分析、语法分析、语义分析
  20. 计算机辅助药物设计研发新药论文,计算机辅助药物设计在新药研发中应用进展.pdf...

热门文章

  1. physxloader.dll x86_PhysXLoader.dll 2.8.3.14
  2. Java,Python和大数据,哪个发展前景最好
  3. 关注老年健康雨中情为养老院维修渗漏
  4. windows图形编程基础
  5. 从中台模式的式微,到ChatGPT的兴起
  6. (转)Cannot resolve directory 'xxx'
  7. 写用户注册时遇到--请输入短信验证码
  8. CharIndex()
  9. 文件管理精灵 v3.46 bt
  10. 现在很多人将微信朋友圈关掉,这是为什么,说明了什么?