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

3.3.2 Silo的生命周期管理

Orelans运行时在ServiceLifecycleStage内为Silo服务的启动与停止的过程定义了若干阶段。

• First阶段:即Silo服务的起始阶段,在Orleans默认环境中只负责日志服务的初始化。

• RuntimeInitialize阶段:在此阶段执行运行时环境的初始化及Silo线程的初始化工作。

• RuntimeServices阶段:运行时服务的开始阶段,Silo在此阶段初始化网络及多种代理服务。

• RuntimeStorageServices阶段:运行时存储服务的初始化阶段,当前Orleans版本暂未被使用。

• RuntimeGrainServices阶段:启动有关Grain的运行时服务,包括Grain类型管理、Membership服务及Grain目录服务等。

• AfterRuntimeGrainServices阶段:处理在应用层服务启动前需要处理的支撑服务。

• ApplicationServices阶段:应用层相关服务在此阶段启动。

• BecomeActive阶段:此阶段的Silo服务将尝试加入Orleans服务集群。

• Active阶段:在此阶段Silo服务器已经被集群接收并可以承载实际的业务请求。

• Last阶段:Silo服务的最后阶段,仅为占位符。

Silo服务的启动过程严格按照上述阶段依次完成从低到高的服务组件搭建与链接,并保证所有组件正确、完整地初始化了逻辑;在Silo服务的停止阶段,对于常规的服务停止(Silo主机完成所有正在进行的服务请求并退出)流程而言,Silo服务在等待所有待处理任务执行完毕后,按照组件依赖树从上到下的顺序依次结束各组件服务,保证在退出过程中各个组件运转正常并释放所有系统资源,且尽最大努力更新集群状态表中自身服务状态,确保集群服务不受本机服务退出的影响。

1. First阶段

由于OrelansLifecycleSubject并没有将Silo的生命周期分为若干确定的步骤,因此开发者可以通过Participate方法将自定义逻辑注册于Silo生命周期中的任意位置,但为了开发者及维护人员更加清晰地知悉Silo在其整个生命周期中的实际运行顺序,Orleans运行时将Silo的日志服务的初始化注册在First阶段,以为后续任何阶段的服务逻辑提供日志服务,并以标准日志格式记录下在各个阶段编号中实际运行的业务逻辑,以下为部分日志示例:

2.RuntimeInitialize阶段

在启动流程的RuntimeInitialize阶段中,Silo进程将并行运行以下逻辑,以初始化Orleans运行时。

1)Silo实例:

• 注册进程退出处理逻辑,在Silo进程退出时执行任务中止等必要逻辑。

• 配置.NET线程池线程中的最小个数。

2)网络连接:

• 绑定服务器本地Silo连接侦听端口并启动外部Silo连接侦听服务SiloConnectionListener。

• 初始化外部Silo连接状态维护服务SiloConnectionMaintainer,开始监控外部Silo状态并维护相应的连接服务。

• 初始化网关连接侦听服务GatewayConnectionListener,绑定外部网关服务端口。

3)Membership服务:

• 完成本地Membership协议代理服务的初始化。

• 启动ClusterMembershipService并开始订阅集群Membership更新消息。

4)内部运行时:初始化内部组件,包括序列化管理器SerializationManager、内部定时器SafeTimer及Grain类型管理器GrainTypeManager。

5)系统性能监测:注册物理内存、CPU利用率监测定时任务。

在服务停止流程的RuntimeInitialize阶段中,Silo进程会并行执行以下组件的注销及释放逻辑。

1)Silo实例:

• 停止所有传入消息代理服务,包括应用入站消息代理、系统入站消息代理及Ping消息代理服务。

• 停止系统心跳及自恢复服务看门狗计时器。

• 停止系统消息中心MessageCenter。

• 停止Silo性能统计管理器SiloStatisticsManager。

• 将自身状态标识为终止。

2)网络连接:

• SiloConnectionListener服务取消对本地Silo连接侦听端口的绑定,并主动断开所有现存连接。

• SiloConnectionMaintainer停止监控外部Silo连接状态。

• GatewayConnectionListener服务取消对外部网关端口的绑定,并主动断开所有现存连接。

• 连接管理器ConnectionManager断开所有已知网络连接。

3)Membership服务:

• ClusterMembershipService停止订阅集群Membership更新消息。

• Membership协议代理服务将Membership表中Silo状态置为Dead,并停止定时更新Silo状态。

• Silo状态监听管理器停止更新本地Silo状态。

4)系统性能监测:停止物理内存、CPU利用率监测定时任务。

3.RuntimeServices阶段

在RuntimeServices阶段的启动流程中,Silo依赖的以下相关服务组件将会进行相应的构建、注册及启动。

1)Silo内部消息中心Message Center。

2)入站消息代理服务Incoming Message Agents(即应用入站消息代理、系统入站消息代理及Ping消息代理)。

3)本地Grain实例索引服务LocalGrainDirectory。

4)隐式流订阅表ImplicitStreamSubscriberTable。

5)运行时流处理服务StreamProvider。

6)其他各类系统内建服务对象,包括:

• Silo实例管理服务SiloControl。

• 多集群日志一致性协议网关服务ProtocolGateway。

• Orleans部署实例负载监测服务DeploymentLoadPublisher。

• 远程Grain实例索引服务RemoteGrainDirectory。

• 远程集群Grain实例索引服务RemoteClusterGrainDirectory。

• 客户端请求网关注册服务ClientObserverRegistrar。

• Orleans运行时类型管理器TypeManager。

• Membership服务MembershipOracle。

• 多集群Membership服务MultiClusterOracle。

7)Silo运行状态记录服务SiloStatusOracle。

8)Reminder Grain服务LocalReminderService。

9)Grain类目服务Catalog。

在RuntimeServices阶段的终止流程则相对简单,Silo服务器将通知内部消息中心Message Center拒绝所有对该Silo的应用请求消息,并停止所有正在运行的本地应用响应逻辑。

4.RuntimeGrainServices阶段

在RuntimeGrainServices阶段,Silo服务器已经完成了基础Orleans运行时中底层服务的启动,在RuntimeGrainServices阶段将对以下组件服务进行管理。

1)Silo内置Grain客户端(启动阶段):

• 将自身注册至客户端请求网关注册服务ClientObserverRegistrar。

• 加入Silo消息中心,并开始处理消息循环。

• 初始化集群客户端并初始化连接。

2)Silo内置Grain客户端(停止阶段):

• 关闭入站消息管道并停止Silo消息中心内的消息循环。

• 关闭集群客户端连接。

3)Membership服务(启动阶段):开始定时刷新本地Membership Table任务。

4)Membership服务(停止阶段):停止定时刷新本地Membership Table任务。

5)Silo核心服务(启动阶段):

• 创建所有在容器中注册的Grain服务(默认Silo实现中仅包含本地Reminder服务)。

• 执行Orleans运行时类型管理器TypeManager的初始化逻辑。

• 启动多集群Silo状态监测服务MultiClusterOracle。

• 启动Silo性能统计管理器SiloStatisticsManager。

• 启动Orleans部署实例负载监测服务DeploymentLoadPublisher。

• 启动系统心跳及健康监测服务看门狗定时器。

5. AfterRuntimeGrainServices阶段

在AfterRuntimeGrainServices阶段,Silo性能统计管理器SiloStatisticsManager及Silo本地Membership代理服务将会启动并尝试加入Membership协议。

6. ApplicationServices阶段

ApplicationServices阶段负责Silo中应用层服务组件的挂载,主要包括持久化组件和Grain版本管理所依赖的底层组件。

1)在启动阶段:

• Grain版本管理存储服务检查并确保所依赖的Grain存储服务GrainStorage初始化完成。

• 启动内存持久化型提醒表单服务InMemoryReminderTable。

2)在停止阶段:停止内存持久化型提醒表单服务InMemoryReminderTable。

值得注意的是,各类持久化服务(AdoNet/DynamoDB/Azure Storage)、内置的内存持久化服务和持久化流服务的默认初始化挂载阶段都为ApplicationServices阶段,而对于内置的内存持久化服务而言,其初始化阶段必须要晚于RuntimeGrainServices以确保其所依赖的Grain服务初始化完成。

7. BecomeActive阶段

在BecomeActive阶段,Silo服务器将完成实际承载业务流量前的最终准备逻辑及停止处理业务请求的初步关闭逻辑,包括:

1)在启动阶段:

• 打开消息中心MessageCenter中的外部网关服务。

• 将自身状态标识为运行中(Running)。

• 将Silo状态在全局Membership表中更新为Active。

• 注册心跳服务保证Membership表中的Silo状态更新。

2)在停止阶段:

• 停止本地Grain实例索引服务GrainDirectory。

• 强制休眠所有Grain实例。

• 停止从外部网关接受新的客户端请求。

• 将Silo状态在全局Membership表中更新为正在停止状态(Stopping)。

• 停止Membership心跳服务。

8.Active阶段

Active阶段中包含了Silo服务准备阶段最高层的服务启动/停止过程,在启动阶段,Silo的服务初始化过程将在Active阶段之后结束,Silo本身也将成为集群内实际承载业务的逻辑节点,其影响的系统组件包括以下几个。

1)Silo主服务(启动阶段):

• 启动Reminder服务。

• 启动所有Grain服务(默认Silo实现中仅包含本地Reminder服务)。

2)Silo主服务(停止阶段):

• 停止Reminder服务。

• 停止所有Grain服务。

3)网关连接侦听服务GatewayConnectionListener开始接收外部客户端连接(启动阶段)。

4)本地Membership缓存列表服务:

• 注册并启动Membership缓存列表定时清理服务(启动阶段)。

• 停止Membership缓存列表定时清理服务(停止阶段)。

5)集群健康监控服务ClusterHealthMonitor(启动阶段):

• 开始根据Membership缓存列表内的更新维护集群健康状态对象。

• 开始集群内Silo服务器间定时心跳检测保活服务。

6)集群健康监控服务ClusterHealthMonitor(停止阶段):

• 停止维护集群健康状态并释放相关对象。

• 停止集群内定时心跳监测。

7)分布式事务代理统计监测服务TransactionAgentStatisticsReporter:

• 启动定时性能监测上报任务(启动阶段)。

• 停止定时性能监测上报任务(停止阶段)。

此外,Orleans持久化数据流服务PersistentStreamProvider的默认启动阶段也为Active阶段,而所有通过AddStartupTask扩展方法注册到Silo启动过程中的任务也都默认会被注册到Active阶段执行。