培训
Microsoft Orleans
Orleans:
- 是一个跨平台框架,用于构建可靠且可缩放的分散式应用。 分布式应用定义为跨多个进程的应用,通常使用对等通信来超越硬件边界。
- 从单个本地服务器扩展到了云中数千个分布式、高度可用的应用。
- 将熟悉的概念和 C# 习语扩展到了多服务器环境。
- 在设计上可弹性缩放。 当主机加入群集时,它可以接受新的激活。 当主机退出群集时,该主机上的先前激活将根据需要在其余主机上重新激活。 主机可能会因纵向缩减或计算机故障而退出群集。 Orleans 群集可以纵向缩减为单个主机。 用于启用弹性缩放的相同属性会启用容错。 群集可自动检测故障并快速从故障中恢复。
- 通过提供一组常见的模式和 API,简化分布式应用开发的复杂性。
- 熟悉单一服务器应用开发的开发人员可以改为构建可复原、可缩放的云原生服务和分布式应用。
- 有时称为“分布式 .NET”。
- 构建云原生应用时选择的框架。
- 可以在支持 .NET 的任意位置运行。 这包括将它托管在 Linux、Windows 和 macOS 上。
- 应用可以部署到 Kubernetes、虚拟机和 PaaS 服务,例如 Azure 应用服务和 Azure 容器应用。
Orleans 基于“执行组件模型”。 执行组件模型起源于 1970 年代早期,现在是 Orleans 的核心组件。 执行组件模型是一种编程模型,其中的每个执行组件是一个轻型、并发、不可变的对象,该对象封装一个状态片段和相应的行为。 执行组件使用异步消息以独占方式相互通信。 值得注意的是,Orleans 发明了虚拟执行组件抽象,其中的执行组件永久存在。
备注
执行组件是始终以虚拟方式存在的纯逻辑实体。 无法显式创建或销毁执行组件,执行它的服务器发生故障不会影响它的虚拟存在形式。 由于执行组件始终存在的,因此它们始终可寻址。
这是为构建面向云时代的新一代分布式应用的一种新颖方法。 Orleans 编程模型在不限制功能或者对开发人员施加约束的前提下驯服了高度并行分布式应用固有的复杂性。
有关详细信息,请参阅 Microsoft Research 编写的 Orleans:虚拟执行组件。 虚拟执行组件表示为 Orleans grain。
Grain 是多个 Orleans 基元中的一个。 就执行组件模型而言,grain 是一个虚拟执行组件。 任何 Orleans 应用程序中的基本构建块都是一个 grain。 grain 是由用户定义的标识、行为和状态组成的实体。 考虑 grain 的以下视觉表示形式:
grain 标识是用户定义的键,使 grain 始终可供调用。 grain 可由其他 grain 调用,或由任意数量的外部客户端调用。 每个 grain 都是类的实例,用于实现以下一个或多个接口:
- IGrainWithGuidKey:带有
Guid
键的 grain 标记接口。 - IGrainWithIntegerKey:带有
Int64
键的 grain 标记接口。 - IGrainWithStringKey:带有
string
键的 grain 标记接口。 - IGrainWithGuidCompoundKey:带有组合键的 grain 标记接口。
- IGrainWithIntegerCompoundKey:带有组合键的 grain 标记接口。
grain 能够包含可存储在任何存储系统中的易失性或持久性状态数据。 因此,grain 隐式将应用程序状态分区,实现自动可伸缩性并简化从故障中恢复的过程。 当 grain 处于活动状态时,grain 状态将保存在内存中,从而降低延迟并减轻数据存储的负载。
Grain 的实例化由 Orleans 运行时按需自动执行。 有一段时间未使用的 grain 会自动从内存中删除以释放资源。 之所以能够做到这一点,是因为 grain 具有稳定的标识,无论它们是否已加载到内存中,都可以调用它们。 这样还能以透明方式从故障中恢复,因为调用方在任何时间点都不需要知道在哪个服务器上实例化了 grain。 Grain 具有受管理的生命周期,Orleans 运行时负责按需激活/取消激活和放置/定位 grain。 这样,开发人员就可以按照所有 grain 都在内存中的情况那样编写代码。
silo 是 Orleans 基元的另一个示例。 silo 承载一个或多个 grain。 Orleans 运行时实现应用程序的编程模型。
通常,一组 silo 作为一个群集运行,以实现可伸缩性和容错。 作为群集运行时,silo 会相互协调,以分配工作并检测故障以及从故障中恢复。 运行时使承载在群集中的 grain 能够相互通信,就如同它们在单个进程中一样。 下图可视化了群集、silo 和 grain 之间的关系:
上图显示了群集、silo 和 grain 之间的关系。 可以组建任意数量的群集,每个群集包含一个或多个 silo,而每个 silo 包含一个或多个 grain。
除了核心编程模型以外,silo 还为 grain 提供一组运行时服务,例如计时器、提醒(持久计时器)、持久性、事务、流等。 有关详细信息,请参阅我可以使用 Orleans 做什么?
Web 应用和其他外部客户端使用客户端库来调用群集中的 grain,该库会自动管理网络通信。 为简单起见,还可将客户端与 silo 一起承载在同一个进程中。
Orleans 是用于构建云原生应用的框架,每当你构建最终需要缩放的 .NET 应用时,请考虑使用 Orleans。 Orleans 的用途看似数不胜数,但下面是一些最常见的用途:游戏、银行、聊天应用、GPS 跟踪、股票交易、购物车、投票应用等。 Microsoft 在 Azure、Xbox、Skype、Halo、PlayFab、Gears of War 和其他许多内部服务中都使用了 Orleans。 Orleans 的许多功能使之可以轻松用于各种应用程序。
Orleans 提供简单的持久性模型,确保在处理请求之前有可用的状态,并使状态保持一致。 grain 可以有多个命名的持久数据对象。 例如,可为用户的个人资料创建一个名为“profile”的对象,并为用户的库存创建一个名为“inventory”的对象。 可将此状态存储在任何存储系统中。
当 grain 正在运行时,状态将保存在内存中,这样就可以在不访问存储的情况下为读取请求提供服务。 当 grain 更新其状态时,调用 IStorage.WriteStateAsync 可确保更新后备存储以实现持久性和一致性。
有关详细信息,请参阅 Grain 持久性。
提醒是 grain 的持久计划机制。 提醒可用于确保在将来某个时间点完成某种操作,即使 grain 在当时尚未激活。 计时器是对应于提醒的非持久机制,可用于不需要可靠性的高频率事件。
有关详细信息,请参阅计时器和提醒。
在 Orleans 中激活某个 grain 时,运行时会决定要在哪个服务器 (silo) 上激活该 grain。 这称为 grain 放置。
Orleans 的放置过程完全可配置。 开发人员可以从一组现成的放置策略中进行选择,例如随机、本地优先和基于负载,或者可以配置自定义逻辑。 这样,就可以十分灵活地确定要在哪个位置创建 grain。 例如,可将 grain 放置在与它们需要操作的资源相互靠近的服务器上,或者放置在与它们通信的其他 grain 靠近的服务器上。
有关详细信息,请参阅 Grain 放置。
以妥善考虑到变化的方式升级生产系统可能颇有难度,特别是在有状态系统中。 考虑到这一点,可对 Orleans 的 grain 接口进行版本控制。
群集将在哪些 grain 实现可在群集中的哪些 silo 上使用与这些实现的版本之间保留一种映射。 在将调用路由到 grain 时,运行时会结合放置策略使用此版本的信息来做出放置决策。 此外,为了安全更新版本受控的 grain,它还会启用异构群集,其中的不同 silo 可以使用不同的 grain 实现集。
有关详细信息,请参阅 Grain 版本控制。
无状态工作线程是特殊标记的 grain,它们没有任何关联状态,可以同时在多个 silo 上激活。 这可以提高无状态函数的并行度。
有关详细信息,请参阅无状态工作线程 grain。
grain 调用筛选器是许多 grain 共有的逻辑。 Orleans 支持传入和传出调用的筛选器。 用于授权、日志记录和遥测以及错误处理的筛选器都是常见的筛选器。
可以使用请求上下文通过一系列请求来传递元数据和其他信息。 请求上下文可用于保存分布式跟踪信息或任何其他用户定义值。
除了上述简单的持久性模型之外,grain 还可以有事务状态。 多个 grain 可以一起参与 ACID 事务,而不管它们的状态最终存储在哪个位置。 Orleans 中的事务是分布式且分散式的(没有中心事务管理器或事务协调器),并具有可序列化隔离性。
有关事务的详细信息,请参阅事务。
流可帮助开发人员准实时地处理一系列数据项。 Orleans 流是托管式的;在 grain 或客户端发布或订阅流之前,不需要创建或注册流。 这样就可以更好地将流生成者和使用者相互解耦,并将其与基础结构解耦。
流的处理非常可靠:grain 可以存储检查点(游标),并在激活期间或在任何后续时间重置为存储的检查点。 流支持将消息批量传递给使用者,以提高效率和恢复性能。
流由 Azure 事件中心、Amazon Kinesis 等队列服务提供支持。
可将任意数量的流多路复用到较少数量的队列,处理这些队列的责任在整个群集中平均分摊。
如果你对 Orleans 的视频介绍感兴趣,请观看以下视频: