Orleans是微软推出的相似Scala Akka的Actor模型,Orleans是一个创建在.NET之上的,设计的目标是为了方便程序员开发须要大规模扩展的云服务, 可用于实现DDD+EventSourcing/CQRS系统。html
传统的三层体系结构包括无状态的前端,无状态的中间层和存储层在可伸缩性方面是有限制的,因为存储层在延迟和吞吐量方面的限制,这对于每一个用户请求都有影响。一般办法是在中间层和存储层之间添加缓存层来提升性能。然而,缓存会失去了大部分的并发性和底层存储层的语义保证。为了防止缓存和存储池的不一致更新,应用程序或缓存管理器须要实现一个并发控制协议。前端
不管是否使用缓存,无状态中间层并不提供本地数据,由于它使用的是数据装载范式: 对于每一个请求,数据是来自存储层或缓存加装到中间层,若是是一个社会关系图,一个请求将会激活关联不少子实体对象,这就对缓存一致性带来更大的挑战。git
Actor模型提供了一个解决这些挑战的有吸引力的依靠函数装载的范式。Actor容许创建一个有状态的中间层,缓存的性能优点与封装的数据局部性都经过特定于应用程序的业务实体封装协调了(DDD的聚合根用行为守卫状态,聚合根保存在缓存中,聚合根实体的状态字段也在缓存中,对状态字段的操做只能经过实体行为,保证状态一致性)。此外,Actor容易实现中间层中水平的、"社会"、实体之间的关系。程序员
分布式系统编程的另外一个观点是面向对象编程(OOP)。虽然OOP是一个创建复杂系统模型直观的方法,可是他被受欢迎的面向服务的体系结构(SOA)边缘化了。固然人们仍然能够受益于OOP实现服务组件时。然而,在系统层面上,开发人员必须考虑松耦合的分区服务,一般会致使和应用程序的概念业务对象不匹配,这致使了目前主流方向由开发人员构建分布式系统很是困难。Actor模型将OOP带回了系统级开发,开发人员很是像熟悉交互的对象的模型。github
例如Erlang和Akka的Actor平台在简化分布式系统编程方面是向前迈出了一步。然而,他们仍然负担与许多分布式系统的复杂性,由于开发人员面临相对低水平的抽象和系统服务。关键的挑战是开发管理Actor生命周期的代码,处理分布式竞争、处理故障和恢复Actor以及分布式资源管理等等都很复杂,所以,若是创建一个应用程序必须正确的解决这些问题,开发人员则必须是一个分布式系统专家(难度太大)。编程
为了不这些复杂性,微软研究院建造了Orleans的编程模型,运行时它提升了Actor的抽象级别。Orleans的目标不是分布式系统专家级别的开发人员,虽然咱们的专家客户发现它也有吸引力。和现有的基于actor平台有本质差别,它是把Actor做为虚拟实体,而不是实际物理的。缓存
首先,一个Orleans的Actor老是存在的,可是它不能被显式地建立或销毁。它的存在超越任何内存中任何实例的生命周期,从而超越了任何特定服务器的生命周期。服务器
第二,Orleans Actor是自动实例化:若是内存没有Actor实例,它会自动建立,发送到Actor的一个消息是当前服务器上建立一个新的实例。一个未使用的Actor实例做为运行时资源管理的一部分自动回收。一个actor实例历来不会失败: 若是服务器S崩溃, 发送给这个S中Actor的下一个消息将被自动实例化到另一个服务器A,消除应用程序须要监督和人为编码显式地重建失败的Actor。并发
第三,Actor的位置实例对应用程序代码是透明的,这极大地简化了编程。app
第四,Orleans能够自动建立多个实例相同的无状态的Actor,Actor能够无缝地热扩展。
Orleans给开发人员一个虚拟"Actor空间",相似于虚拟内存,使他们可以调用系统中的任何Actor,无论它是否存在于内存。虚拟化间接依赖从虚拟Actor到实际Actor的映射。这种级别的间接寻址为运行时解决许多分布式系统问题带来机会,不然开发人员必须直接本身解决这些复杂问题,如Actor定位和负载平衡、失活未使用的Actor,复苏因服务器失败的Actor,这是出了名的困难。所以,虚拟Actor方法大大简化了编程模型。同时容许运行时加载和透明地从失败中恢复。
Orleans官方文档:https://github.com/dotnet/orleans/wiki
Orleans白皮书: http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf