2.4 Grain的内部状态与生命周期管理
2.4.1 Grain的唤醒与休眠
Orleans应用程序通过虚拟Actor机制,确保了任意Grain实例可以即时响应外部服务请求。但由于实际系统资源的限制,在Orleans应用程序内部,Grain实例对象实际会自动在休眠态(Persisted)与活跃态(Volatile)间进行切换,在空闲状态下释放对系统资源的占用。处于休眠态的Grain实例对象不占用任何运行时资源(CPU及内存),其内部状态由Orleans运行时通过存储服务(数据库或本地磁盘)进行存储,当Orleans应用程序首次启动时,其内部所有的Grain实例都默认处于休眠态;当Grain实例接收到外部服务请求时,Orleans运行时将主动处理对该实例对象的唤醒过程,即将其状态数据通过存储服务载入运行时内存中,使其从休眠态转换至活跃态,并完成服务请求的执行与响应;Orleans运行时会定期监控系统内所有活跃态的Grain实例对象,主动清理并休眠空闲时间过长的活跃态Grain对象,并释放其占用的运行时资源。
如图2-3所示,Grain实例由休眠态转变为活跃态的过程被称为唤醒(Activate)过程,唤醒过程由对该Grain实例的服务请求触发,Orleans运行时在唤醒Grain实例的过程中,首先会在应用程序内部动态创建一个空白Grain实例对象(Grain Activation),并从外部存储服务中载入对应Grain的状态信息,并将Grain实例对象标记为活跃态,开始响应等待中的外部服务请求。与唤醒过程不同,Grain对象的休眠过程仅由Orleans运行时触发:当Orleans运行时监测到活跃态Grain实例的闲置时间超过阈值时,Orleans运行时将自动保存其当前状态并对其所占用的运行时资源进行回收。
•图2-3 Grain实例的状态转移过程
在互联网应用场景中,通常需要对热点数据及服务进行缓存以提高其读取及写入的效率,并根据一定的逐出机制,在数据对象的读写频次降低后将其保存至大容量的低速存储系统中。虚拟Actor模型的唤醒/休眠策略同样可以看作是在Actor维度的缓存/序列化过程,在Actor模型划分较为合理时,每个Actor实例所承载的业务流量通常具有天然的时序集中性,虚拟Actor模型则可由此减少对Actor实例频繁的唤醒/休眠操作,从而提高Orleans集群的资源利用率。例如,若将用户的银行账户定义为Grain对象,并使用银行账号作为该Grain对象的逻辑标识,则特定用户的账户余额查询及转账服务都由账户对应的Grain实例提供,而该Grain实例将在用户使用银行账户功能时被唤醒,并在用户退出该银行账号后由Orleans运行时自动触发休眠操作,以回收其所占用的系统资源。