Microsoft Orleans
Orleans:
- 是用于构建可靠且可缩放的分布式应用的跨平台框架。 分布式应用定义为跨多个进程的应用,通常超出使用对等通信的硬件边界。
- 从单个本地服务器扩展到云中的数千个分布式高可用性应用。
- 将熟悉的概念和 C# 习惯扩展到多服务器环境。
- 在设计上可弹性缩放。 当主机加入群集时,它可以接受新的激活。 当主机离开群集时,该主机上的先前激活将根据需要在剩余主机上重新激活。 主机可能会因为缩减规模或计算机故障而离开群集。 可以将 Orleans 群集缩减到单个主机。 用于启用弹性缩放的相同属性会启用容错。 群集会自动检测并快速从故障中恢复。
- 通过提供一组常见的模式和 API,简化了分布式应用开发的复杂性。
- 使熟悉单服务器应用开发的开发人员能够过渡到构建可复原、可缩放的云原生服务和分布式应用。
- 有时称为“分布式 .NET”。
- 构建云原生应用时选择的框架。
- 在支持 .NET 的任何位置运行。 这包括在 Linux、Windows 和 macOS 上进行托管。
- 可将应用部署到 Kubernetes、虚拟机和 PaaS 服务,例如 Azure 应用服务,Azure 容器应用。
"演员模型"
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 标记接口。
颗粒可以具有易失性状态数据或持久性状态数据,并且这些数据可以存储在任何存储系统中。 因此,粒度隐式分区应用程序状态,实现自动可伸缩性和简化故障恢复。 粒度状态保留在内存中,而粒度处于活动状态,导致数据存储的延迟降低和负载更少。
Grain 的实例化由 Orleans 运行时按需自动执行。 有一段时间未使用的 grain 会自动从内存中删除以释放资源。 之所以能够做到这一点,是因为 grain 具有稳定的标识,无论它们是否已加载到内存中,都可以调用它们。 这样还能以透明方式从故障中恢复,因为调用方在任何时间点都不需要知道在哪个服务器上实例化了 grain。 Grain 具有受管理的生命周期,Orleans 运行时负责按需激活/取消激活和放置/定位 grain。 这样,开发人员就可以编写代码,就像所有粒度始终在内存中一样。
什么是孤岛?
silo 是 Orleans 基元的另一个示例。 筒仓存放一个或多个谷物。 Orleans 运行时是实现应用程序的编程模型的原因。
通常,一组孤岛作为群集运行,用于伸缩性和容错。 在作为群集运行时,节点相互协调,以分配任务并检测故障进行恢复。 运行时使群集中托管的粒度可以相互通信,就像它们位于单个进程中一样。 为了帮助可视化群集、孤岛和粒度之间的关系,请考虑下图:
上图显示了群集、孤岛和粒度之间的关系。 可以组建任意数量的群集,每个群集包含一个或多个 silo,而每个 silo 包含一个或多个 grain。
除了核心编程模型外,Silos 还为 grains 提供一组运行时服务,例如计时器、持久提醒(持久计时器)、持久性、事务、流等。 有关详细信息,请参阅我可以使用 Orleans 做什么?。
Web 应用和其他外部客户端通过客户端库在群集中调用粒子,该库会自动管理网络通信。 为简单起见,还可将客户端与 silo 一起承载在同一个进程中。
我可以使用 Orleans 做什么?
Orleans 是用于生成云原生应用的框架,每当生成最终需要缩放的 .NET 应用时,都应该考虑这一框架。 使用 Orleans的方法似乎无休止,但以下是一些最常见的方法:游戏、银行、聊天应用、GPS 跟踪、股票交易、购物车、投票应用等。 Orleans 被 Microsoft 用于 Azure、Xbox、Skype、Halo、PlayFab、Gears of War 和其他许多内部服务。 Orleans 有许多功能,可用于各种应用程序。
持久性
Orleans 提供了一个简单的持久性模型,可确保在处理请求之前提供状态,并维护其一致性。 颗粒可以有多个命名的持久性数据对象。 例如,可为用户的个人资料创建一个名为“profile”的对象,并为用户的库存创建一个名为“inventory”的对象。 此状态可以存储在任何存储系统中。
当 grain 正在运行时,状态将保存在内存中,这样就可以在不访问存储的情况下为读取请求提供服务。 当 grain 更新其状态时,调用 IStorage.WriteStateAsync 可确保更新后备存储以实现持久性和一致性。
有关详细信息,请参阅 粒度持久性。
计时器和提醒
提醒是 grain 的持久计划机制。 提醒可用于确保在将来某个时间点完成某种操作,即使 grain 在当时尚未激活。 计时器是提醒的非持久对应项,可用于不需要可靠性的高频率事件。
有关详细信息,请参阅计时器和提醒。
灵活的 grain 放置
当 Orleans中的一个Grain被激活时,运行时会决定在哪个服务器(silo)上激活该Grain。 这称为 grain 放置。
Orleans 的放置过程完全可配置。 开发人员可以从一组现成的放置策略(例如随机、首选本地和基于负载)中进行选择,也可以配置自定义逻辑。 这允许在决定创建粒度的位置方面具有完全的灵活性。 例如,可将 grain 放置在与它们需要操作的资源相互靠近的服务器上,或者放置在与它们通信的其他 grain 靠近的服务器上。
有关详细信息,请参阅 Grain 放置。
Grain 版本控制和异构群集
以安全考虑更改的方式升级生产系统可能具有挑战性,尤其是在有状态系统中。 为此,可以对 Orleans 中的粒度接口进行版本控制。
群集将在哪些 grain 实现可在群集中的哪些 silo 上使用与这些实现的版本之间保留一种映射。 在将调用路由到 grain 时,运行时会结合放置策略使用此版本的信息来做出放置决策。 此外,为了安全更新版本受控的 grain,它还会启用异构群集,其中的不同 silo 可以使用不同的 grain 实现集。
有关详细信息,请参阅 Grain 版本控制。
无国籍工人
无状态工作线程是特殊标记的 grain,它们没有任何关联状态,可以同时在多个 silo 上激活。 这样可以提高无状态函数的并行度。
有关详细信息,请参阅无状态工作线程 grain。
Grain 调用筛选器
grain 调用筛选器是许多 grain 共有的逻辑。 Orleans 支持传入和传出呼叫的筛选器。 授权、日志记录和遥测的筛选器以及错误处理都被视为常见。
请求上下文
可以使用请求上下文通过一系列请求来传递元数据和其他信息。 请求上下文可用于保存分布式跟踪信息或任何其他用户定义的值。
分布式 ACID 事务
除了上述简单的持久性模型之外,grain 还可以有事务状态。 无论其状态最终存储在何处,多个粒度都可以一起参与 ACID 事务。 Orleans 中的事务是分布式和分散的(没有中央事务管理器或事务协调器),并且具有 可序列化的隔离。
有关交易的详细信息,请参阅 交易。
溪流
流可帮助开发人员近乎实时地处理一系列数据项。 Orleans 流是托管式的;在 grain 或客户端发布或订阅流之前,不需要创建或注册流。 这可以更好地将流生成者和使用者与彼此和基础结构分离。
流的处理非常可靠:grain 可以存储检查点(游标),并在激活期间或在任何后续时间重置为存储的检查点。 流支持将消息批量传递给使用者,以提高效率和恢复性能。
数据流由排队服务(如 Azure 事件中心、Amazon Kinesis 等)支撑。
可将任意数量的流多路复用到较少数量的队列,处理这些队列的责任在整个群集中平均分摊。
Orleans 视频简介
如果你对 Orleans的视频简介感兴趣,请查看以下视频: