Orleans:构建高性能分布式Actor服务
上QQ阅读APP看书,第一时间看更新

1.2 NET平台与Orleans服务框架

.NET是由微软公司开发的免费、开源的应用程序开发平台,可运行在多种处理器架构(x64、x86、ARM32及ARM64)及多种操作系统(Windows、Linux及macOS)上,开发人员在.NET平台上使用多种语言(C#、F#或Visual Basic)构建桌面程序、云服务、嵌入式应用及机器学习应用。

.NET技术是多种.NET运行时、应用程序框架及相应SDK实现的总称,通过一组名为.NET Standard的基础API集合进行规范,实现.NET应用程序的多平台兼容性。当前,由微软公司开发并维护的.NET技术实现方案如下。

• .NET Core:具有跨平台特性的.NET实现形态,可以运行在Windows、macOS和Linux系统中,支持ASP.NET Core、Windows Form及Windows Presentation Foundation(WPF)应用程序,最新版本为.NET Core 3.1。

• .NET Framework:.NET平台的原始实现形态,仅面向Windows系统,适用于Windows桌面应用程序开发,最新版本为.NET Framework 4.8。

• Mono:主要用于驱动Xamarin应用程序的.NET运行时,其可以运行在Android、macOS、iOS、tvOS和watchOS系统上,最新稳定版本为Mono 6.8.0。

• UWP:适用于物联网及触控式Windows设备的.NET运行时,主要应用在Xbox及便携式Windows 10设备中,最新版本为10.0。

由于.NET Core平台具有开源和跨平台特性,在业界已受到广泛关注。目前,微软正在尝试基于.NET Core及.NET Framework对.NET平台的技术实现进行统一(即.NET 5),实现完整的跨平台、跨架构.NET应用程序生态。

Orleans应用服务框架是.NET平台下针对可伸缩分布式应用设计的Actor编程模型框架,该项目最初由Microsoft Research在2010年发起,并主要用于支撑Azure云平台上的多种应用服务(如Halo系列游戏)。Orleans框架于2015年1月正式开源,它使用C#语言编写,并通过虚拟Actor(Virtual Actor)模型提供了一种简明的服务构建方式,使应用开发人员在进行应用开发时可以专注于实现业务逻辑,无须依赖复杂的应用程序编码解决数据的并发访问、异常处理及系统资源分配等问题。

传统Actor模型框架(如Akka)虽然通过对行为和状态的聚合抽象对并发场景下的数据共享操作性能进行了优化,但应用程序仍然需要显式对Actor实例进行管理:应用服务在处理业务请求时,应用程序需要显式地创建处理请求所需的独立响应单元(即Actor实例),并在响应完成时主动释放并回收该Actor实例所占用的系统资源;在运行阶段,应用程序还需要对Actor实例的运行时异常进行监控,并在异常恢复时通过一定的方式重建该Actor实例。传统的Actor模型框架都定义了系统内各Actor对象间的从属关系,使开发人员能够在应用代码层面管理每个Actor实例的运行时生命周期(如在Akka中,通过Actor实例间的树状从属关系来处理资源申请、释放策略并确定Actor运行时异常的监督链路)。在构建应用程序服务时,这种实现策略引入了与实际应用逻辑无关的额外考量因素和逻辑,会在一定程度上增加服务设计和实现的复杂程度。

为了解决以上问题,Orleans框架提出了虚拟Actor模型,将Actor实例的资源、异常及生命周期管理统一交由Orleans运行时进行处理(即将Actor实例托管于Orleans框架运行时),应用程序无须增加烦琐的资源管理及异常监控逻辑,并可以直接通过Orleans运行时API访问Actor服务,从而简化了应用服务的搭建过程。

虚拟Actor模型具有以下特点。

• 在虚拟Actor应用程序中任意Actor对象都逻辑(虚拟)存在于程序内部,但Actor实例对象仅在需要对外提供服务时,由框架运行时负责创建并实例化运行于应用程序内。

• Actor实例对象在完成外部服务请求后,由框架运行时负责资源回收。

• 应用程序在访问Actor实例时无须关心其实际所处位置(如具体存在于服务集群中的某一节点中)。

• Actor实例的运行时异常处理由框架运行时保证,若某Actor实例在运行时发生异常(如服务器崩溃或通信中断),框架运行时将自动重新创建该Actor实例而无须应用程序介入。

可以看出,Orleans框架的虚拟Actor模型极大地简化了应用程序的实现逻辑,开发人员在使用Orleans框架进行应用服务设计和实现时,只需关心和处理业务场景中不同实体间的数据划分方式及操作行为逻辑,即可使用Actor模型快速构建适用于高并发场景的分布式应用程序。