Orleans 是一个跨平台框架,旨在简化分布式应用的生成。 无论是从单个服务器缩放到数千个基于云的应用, Orleans 都提供工具来帮助管理分布式系统的复杂性。 它将熟悉的 C# 概念扩展到多服务器环境,使开发人员能够专注于应用的逻辑。
以下是Orleans提供的内容:
- 它旨在实现弹性扩展和收缩。 添加或删除服务器,并 Orleans 相应地进行调整,以保持容错和可伸缩性。
- 它使用一组通用的模式和 API 简化了分布式应用开发,使其即使在分布式系统新手中也易于访问。
- 它是云原生的,在支持 .NET 的平台上运行-Linux、Windows、macOS 等。
- 它支持新式部署选项,例如 Kubernetes、Azure 应用服务和 Azure 容器应用。
Orleans 通常称为“分布式 .NET”,因为它专注于构建可复原、可缩放的云原生服务。 接下来,让我们探索演员模型。
演员模型
Orleans 基于演员模型。 起源于20世纪70年代初,演员模型现在是Orleans的核心组成部分。 在执行组件模型中,每个 执行组件 都是一个轻量级、并发的不可变对象,它封装了一段状态和相应的行为。 执行组件以独占方式使用异步消息进行通信。 Orleans 值得注意的是发明了 虚拟执行组件 抽象,其中执行组件永久存在。
注意
执行组件是始终以虚拟方式存在的纯逻辑实体。 不能显式地创建或销毁一个参与者,其虚拟存在不受执行其操作的服务器故障影响。 由于执行组件始终存在的,因此它们始终可寻址。
这种新方法有助于为云时代构建新一代分布式应用。 Orleans编程模型在不限制功能或施加约束的情况下,可驯服高度并行分布式应用中固有的复杂性。
有关更多信息,请通过 Microsoft Research 查看 Orleans:虚拟角色。 虚拟执行组件表示为 Orleans grain。
什么是谷物?
Grain 是多个 Orleans 基元中的一个。 就执行组件模型而言,grain 是一个虚拟执行组件。 任何 Orleans 应用程序中的基本构建块都是一个 grain。 grain 是由用户定义的标识、行为和状态组成的实体。 请考虑以下粒度的可视表示形式:
粒度标识是用户定义的密钥,使粒度始终可用于调用。 其他Grain对象或任何数量的外部客户端都可以访问Grain对象。 每个粒度是实现以下一个或多个接口的类的实例:
-
IGrainWithGuidKey:带有
Guid
键的 grain 标记接口。 -
IGrainWithIntegerKey:带有
Int64
键的 grain 标记接口。 -
IGrainWithStringKey:带有
string
键的 grain 标记接口。 - IGrainWithGuidCompoundKey:带有组合键的 grain 标记接口。
- IGrainWithIntegerCompoundKey:带有组合键的 grain 标记接口。
Grains 可以在任何存储系统中存储易失性或持久性状态数据。 因此,粒度隐式分区应用程序状态,实现自动可伸缩性和简化故障恢复。 Orleans 在粒度处于活动状态时将粒度状态保留在内存中,从而导致数据存储的延迟降低和负载更少。
运行时 Orleans 可按需自动实例化粒度。 长时间未使用的谷物会被自动从内存中删除以释放资源。 由于它们的稳定标识,因此可能会进行此删除,从而允许调用粒度,无论它们是否被加载到内存中。 这还可实现从故障中透明恢复,因为调用方无需知道任意时间点粒在哪台服务器上实例化。 粒度具有托管生命周期,运行时 Orleans 负责根据需要激活/停用和放置/定位粒度。 这样就可以编写代码,就像所有粒度始终在内存中一样。
什么是孤岛?
silo 是 Orleans 基元的另一个示例。 筒仓存放一个或多个谷物。 运行时 Orleans 实现应用程序的编程模型。
通常,一组孤岛作为群集运行,用于伸缩性和容错。 作为群集运行时,硅仓会协调以分配工作,检测故障并恢复。 运行时使群集中托管的粒度可以像在单个进程中一样进行通信。 为了帮助可视化群集、孤岛和粒度之间的关系,请考虑下图:
上图显示了群集、孤岛和粒度之间的关系。 可以有任意数量的群集,每个群集都有一个或多个接收器,每个接收器都有一个或多个粒度。
除了核心编程模型之外,silos 还为 grains 提供运行时服务,例如计时器、提醒(持久计时器)、持久性、事务、流等。 有关详细信息,请参阅 如何使用 Orleans?。
Web 应用和其他外部客户端通过客户端库在群集中调用粒子,该库会自动管理网络通信。 为简单起见,还可将客户端与 silo 一起承载在同一个进程中。
可以用Orleans做些什么?
Orleans 是用于生成云原生应用的框架,在生成最终可能需要缩放的 .NET 应用时,应考虑此框架。 使用的方法似乎无休止 Orleans,但以下是一些最常见的方法:游戏、银行、聊天应用、GPS 跟踪、股票交易、购物车、投票应用等。 Orleans Microsoft在 Azure、Xbox、Skype、Halo、PlayFab、Gears of War 和其他许多内部服务中使用。 Orleans 具有许多功能,因此可以轻松地用于各种应用程序。
持久性
Orleans 提供一个简单的持久性模型,确保在处理请求和维护一致性之前的状态可用性。 颗粒可以有多个命名的持久性数据对象。 例如,用户个人资料可能被称为“个人资料”,而其物品清单可能被称为“清单”。 此状态可以存储在任何存储系统中。
当某个任务运行时,Orleans 在内存中保留状态,以便在不访问存储的情况下处理读取请求。 当粒度更新其状态时,调用 IStorage.WriteStateAsync 可确保支持存储更新的持久性和一致性。
有关详细信息,请参阅 粒度持久性。
计时器和提醒
提醒是 grain 的持久计划机制。 使用它们确保操作在将来的某个时间点完成,即使该任务当前未激活。 计时器是提醒的非持久替代品,可用于不需要可靠性的高频事件。
有关详细信息,请参阅计时器和提醒。
灵活的 grain 放置
当Orleans中的一个计算粒度激活时,运行时将决定在哪个服务器(节点)进行激活。 此过程称为颗粒放置。
Orleans 的放置过程完全可配置。 从现成的放置策略(例如随机、首选本地和基于负载)中进行选择,或配置自定义逻辑。 这允许完全灵活地决定谷物创建的位置。 例如,将粒子放置在靠近其需要使用的资源或与其通信的其他粒子的服务器上。
有关详细信息,请参阅 Grain 放置。
Grain 版本控制和异构群集
安全地进行升级,以充分考虑变化的生产系统可能具有挑战性,尤其是在有状态系统中。 为此,可以在其中对粒度接口进行 Orleans版本控制。
群集包含一个映射,该映射用于标识哪些Grain实施可用在哪些独立节点及其版本。 运行时将此版本信息与放置策略一起使用,在将调用路由到粒度时做出放置决策。 除了能够安全地更新版本化Grain, 这还支持异构集群,其中不同的实例具有不同的可用Grain实现集。
有关详细信息,请参阅 Grain 版本控制。
无国籍工人
无状态工作线程是特别标记的颗粒,没有关联的状态,可以同时在多个孤岛上激活。 这样可以提高无状态函数的并行度。
有关详细信息,请参阅无状态工作线程 grain。
Grain 调用筛选器
颗粒调用过滤器是许多颗粒的常用逻辑。 Orleans 支持传入和传出呼叫的筛选器。 常见用途包括授权、日志记录和遥测以及错误处理。
请求上下文
使用 请求上下文通过一系列请求传递元数据和其他信息。 使用请求上下文来保存分布式跟踪信息或任何其他定义的值。
分布式 ACID 事务
除了上述简单持久性模型外,粒度还可以具有 事务状态。 无论其状态最终存储在何处,多个粒度都可以一起参与 ACID 事务。 事务 Orleans 是分布式和分散的(这意味着没有中央事务管理器或协调器),并且具有 可序列化的隔离。
有关交易的详细信息,请参阅 交易。
溪流
流有助于近乎实时地处理一系列数据项。 Orleans 流是自动管理的; 在 grain 或客户端进行发布或订阅之前,流不需要创建或注册。 这可以更好地将流生成者和使用者与彼此和基础结构分离。
流处理可靠:粒度可以存储检查点(游标),并在激活期间或任何后续时间重置为存储的检查点。 流支持将消息批量传递给使用者,以提高效率和恢复性能。
数据流由排队服务(如 Azure 事件中心、Amazon Kinesis 等)支撑。
任意数量的流可以多路复用到较小的队列上,并且处理这些队列的责任在群集中均匀均衡。
Orleans 视频简介
想了解关于 Orleans 的视频简介,请查看以下视频: