Orleans 好处

Orleans 的主要优点是:

  • 开发人员工作效率:即使是非专家程序员。
  • 默认情况下,透明可伸缩性:开发人员无需特别努力。

开发人员工作效率

编程 Orleans 模型通过提供以下关键抽象、保证和系统服务来提高工作效率,而不考虑专业知识级别。

熟悉的面向对象编程(OOP)范式

Grain 是使用异步方法实现已声明的 .NET Grain 接口的 .NET 类。 Grain 显示为可以直接调用其方法的远程对象。 这提供了熟悉的 OOP 范例:将方法调用转换为消息、将它们路由到正确的终结点、调用目标粒度的方法,以及以透明方式处理故障和角情况。

单线程执行粒度

运行时保证粒子在任何时刻只在一个线程上执行。 结合与其他粒度的隔离,开发人员永远不会在粒度级别面临并发,也不需要锁或其他同步机制来控制对共享数据的访问。 仅此功能就使开发分布式应用程序变得易行,即使对于非专家程序员也是如此。

透明激活

仅当有消息需要处理时,运行时环境才会激活粒子。 这可以单独创建粒度引用(由应用程序代码控制)和内存中粒度的物理激活(对应用程序透明)。 这类似于作系统决定何时将页面引入内存以及何时从内存中逐出页面的 虚拟内存 。 同样,运行时 Orleans决定何时激活粒度(将其引入内存),以及何时停用粒度(从内存中逐出)。 应用程序不间断地访问逻辑创建的粒度的完整“内存空间”,无论它们是否在任何给定时间都在物理内存中。

透明激活通过跨硬件资源池放置和迁移粒度实现动态自适应负载均衡。 此功能在传统执行组件模型上显著提高,其中执行组件生存期由应用程序管理。

位置透明度

用于调用粒度的方法或传递给其他组件的粒度引用(代理对象)仅包含粒度的逻辑标识。 运行时 Orleans 以透明方式处理将粒度的逻辑标识转换为其物理位置和路由消息。

应用程序代码无需知道其物理位置即可与粒度通信。 由于故障、资源管理或在调用时粒度被禁用,此位置可能会随时间而变化。

与持久存储的透明集成

Orleans 允许以声明方式将粒度的内存中状态映射到持久性存储。 它同步更新,透明地保证调用方仅在持久状态成功更新后接收结果。 扩展和/或自定义现有持久性存储提供程序集非常简单。

自动传播错误

运行时自动使用异步和分布式 try/catch 语法结构,将未经处理的错误传播到调用链中。 这样一来,错误不会丢失在应用程序内。 这允许将错误处理逻辑放置在适当的位置,而无需在每个级别手动传播错误的繁琐工作。

默认情况下具有透明的可伸缩性

Orleans编程模型指导开发人员通过多个数量级成功缩放应用程序或服务。 它通过整合经过验证的最佳做法和模式并提供低级别系统功能的高效实现来实现这一点。

以下是实现可扩展性和性能的一些关键因素:

应用程序状态的隐式细化分区

使用粒度作为直接可寻址实体隐式分解应用程序的总体状态。 Orleans虽然编程模型没有规定粒度大小,但在大多数情况下,具有相对大量的粒度(数百万或更多)是有意义的,每个粒度都表示自然应用程序实体,例如用户帐户或采购订单。

由于粒度可以单独寻址,并且运行时系统抽象化了其物理位置,这使得Orleans在平衡负载和处理热点方面具有极大的灵活性,而无需应用程序开发人员考虑。

自适应资源管理

颗粒在交互时不会采用其他颗粒的局域性。 由于此位置透明度,运行时可以动态管理和调整可用硬件资源的分配。 运行时通过在计算集群中对放置和迁移粒子做出细致决策,以响应负载和通信模式,同时不影响传入请求的处理,从而实现这一目标。 通过创建特定粒度的多个副本,运行时可以增加其吞吐量,而无需更改应用程序代码。

多路复用通信

Orleans粒度具有逻辑终结点,其中的消息传送跨固定的一组全部物理连接(TCP 套接字)进行多路复用。 这使运行时可以托管数百万个可寻址的实体,使每个实体的操作系统开销保持在较低水平。 此外,激活和停用粒子不会产生注册/注销物理终结点(例如 TCP 端口或 HTTP URL)的成本,甚至不会涉及关闭 TCP 连接的成本。

高效的计划

运行时使用 .NET 线程池调度许多单线程计算单元的执行,该线程池经过高度优化以提升性能。 当以非阻塞、基于延续的样式(编程模型的要求 Orleans )编写粒度代码时,应用程序代码以“协作”多线程方式高效运行,且无争用。 这样,系统就可以实现高吞吐量,以非常高的 CPU 利用率(高达 90%+)运行,并具有极大的稳定性。

粒度数量的增加和负载增大实际上并不会导致额外的线程或其他 OS 原语,这有助于提高单个节点以及整个系统的可伸缩性。

显式异步

编程 Orleans 模型使分布式应用程序的异步性质变得明确,并指导开发人员编写非阻塞异步代码。 与异步消息传送和高效计划相结合,这可以实现大量的分布式并行度和整体吞吐量,而无需显式多线程处理。