写在前面

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/

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

  1. 单光子的产生助力实现大规模分布式量子计算网络

    (来源:MIT News) 剑桥大学的研究人员开发了一种通过在专门设计的发光二极管(LED)中移动单电子来产生单光子的新技术.这项技术发表在<自然通信>杂志上,可以帮助发展新兴的量子通信和 ...

  2. [PPOPP 15] PoweSwitch: 基于同步异步切换的分布式大规模图处理系统 学习总结

    今天要讲的文章PPOPP 2015年的一篇文章,SYNC or ASYNC Time to Fuse for Distributed Graph-Parallel Computation.本文主要想解 ...

  3. GPU---并行计算利器

    转载请引用:GPU---并行计算利器 源于阿里巴巴CCO<猿来如此>分享 1 GPU是什么 如图1所示,这台PC机与普通PC机不同的是这里插了7张显卡,左下角是显卡,在中间的就是GPU芯片 ...

  4. S4:分布式流计算平台

    前段时间考虑监控统计面临的两个问题,一是Key太多的问题.客户端输出日志的埋点程序可以通过LRUMap缓解,但是服务端就比较麻烦.对于某些以MapReduce模式实现的日志分析框架,当一个应用的key ...

  5. BloomFilter–大规模数据处理利器(转)

    BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求1 ...

  6. BloomFilter ——大规模数据处理利器

    BloomFilter--大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求 ...

  7. 那些优雅的数据结构(1) : BloomFilter——大规模数据处理利器

    BloomFilter--大规模数据处理利器 https://www.cnblogs.com/heaad/ Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通 ...

  8. 区块链与分布式隐私计算行业报告 | TokenInsigh

    我们选取了三个不同技术路径的分布式隐私计算项目,分别是采用安全多方计算方案的ARPA.采用Trusted Execution Environment(TEE)硬件支持方案的Trias和采用分布式云计算 ...

  9. 区块链与分布式隐私计算行业报告 | TokenInsight

    随着区块链技术的发展,其功能也从实现点对点的电子现金系统逐渐扩大到不同领域.隐私保护作为区块链中一个重要的课题,也在不断丰富扩充自己的含义--从仅仅确保交易隐私匿名性逐渐加入了对数据所有权.使用权的隐 ...

最新文章

  1. 几百个Android开源个性化控件、工具库、项目、开发工具快快收藏
  2. java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较
  3. 【java】初始化一个指定大小的list,在指定位置set存入元素,下标越界
  4. 深入理解 MySQL—锁、事务与并发控制
  5. 【推荐算法】协同过滤算法——基于用户 Java实现
  6. kali安装步骤失败 选择并安装软件_7Zip v19.00 软件安装步骤
  7. 组装一台工作游戏两用机
  8. 公众号怎么提升阅读量
  9. 如何搭建清晰易懂的数据看板?
  10. i7-1160G7 怎么样 相当于什么水平
  11. EPSON TM U220串口打印机乱码
  12. twitter、facebook、pinterest、linkedin 分享代码
  13. 巴特沃斯滤波器 python代码
  14. 使用安装Ubuntu和Win7双系统
  15. 电视剧的收视排行榜(Python)
  16. 多多云手机【语音引流】创新吸粉模式 -- 语音播放功能模块开发教程
  17. 接口自动化测试(1)
  18. 如何更高好地管理待办事项?
  19. 有关meta learning 要读的论文清单
  20. 1.学Python后到底能干什么?

热门文章

  1. Xubuntu菜单删改条记
  2. c语言 程序延时 校准,c语言实现系统时间校正工具代码分享
  3. 禁用磁盘检查_如何在Windows上禁用“磁盘空间不足”警告
  4. Mysql+Navicat for Mysql
  5. linux 桌面显示视频播放器,Ubuntu 13.10开启媒体播放器VLC桌面通知的步骤
  6. 文件管理、命令别名和glob
  7. JAVA代码—算法基础:数独问题(Sodoku Puzzles)
  8. 移动工具V和选区工具M
  9. Log4Net的WebApplication使用
  10. 学会这些, 让你的服务器远离***影响