2.5 Grain的状态保存
Grain实例在Orleans运行时中并不是常驻于内存的,且Grain实例的激活/休眠过程仅由运行时决定(对开发人员不可见),为了保证在某些实际业务场景中请求处理上下文的连续性,Orleans运行时提供了IPersistentState<TState>及Grain<TState>两种方式用以持久化Grain实例的运行时状态。图2-4中描述了一个在线购物服务内部负责处理用户交互逻辑的Grain实体UserGrain,UserGrain需要存储当前用户信息(Profile)及用户购物车信息(Cart)以允许用户通过客户端API对自身的用户信息进行修改,同时操作账户购物车中的商品清单。
•图2-4 使用外部持久化存储的User Grain
在此业务场景下,UserGrain的标识即可为系统中的UserId,对于某一用户的请求也将由该用户所对应的UserGrain实例进行响应。如图2-5所示,若采用传统后端系统模型设计,通常需要在慢速的持久化存储(SQL集群)和后端服务器间搭建高缓存服务,并依据一定策略将缓存服务中的数据刷写至数据库中,以减少高并发场景下后端数据库服务的连接及读写压力。
•图2-5 采用独立缓存服务构建系统存储模型
相比而言,若采用图2-6所示的Orleans状态持久化逻辑,应用服务可以将服务器集群的运行内存作为外部存储和业务集群的缓存中间件,所有的业务数据修改实际都只发生于服务器集群的本地内存中,当服务器集群内存资源耗尽时,Orleans运行时会自动触发对空闲Grain实例的休眠及资源回收,并在强制休眠过程中自动将需要持久化的状态变量写入外部存储中,不需要业务系统额外增加同步逻辑;当需要在运行时环境中激活新Grain实例时,也将由Orleans运行时自动从外部存储中恢复状态,而不需要在系统增加任何额外逻辑。
•图2-6 Orleans运行时托管的系统存储模型