规则引擎设计文档
实现模型
规则引擎底层实现基于actor模型设计
Actor模型有两种任务调度方式:基于线程的调度、基于事件的调度
基于线程的调度
为每个Actor分配一个线程,在接收一个消息时,如果当前Actor的邮箱为空则会阻塞当前线程。基于线程的调度实现较为简单,但线程数量受到操作的限制,现在的Actor模型一般不采用这种方式。
基于事件的调度
事件可以理解为任务或消息的到来,而此时才会为Actor的任务分配线程并执行。
因此,可以把系统中所有事物都抽象成为一个Actor:
Actor的输入是接收到的消息
Actor接收到消息后处理消息中定义的任务
Actor处理完成任务后可以发送消息给其它Actor
actor模型原理图

内部架构部件
具体的消息流转过程见下图

基于以上理论,规则引擎抽象出了4类actor AppActor
、TenantActor
、RuleChainActor
、RuleNodeActor
,除AppActor之外, 其他Actor都有初始化它的父级Actor,因此它自身的生命周期全部由父级Actor管理。
- 应用actor(AppActor):负责整个规则引擎核心事件的调度,属于服务级别的actor,对外与消息中间件(内部目前实现了基于rabbitmq的消息队列)通信,对内则根据消息内的元数据,路
由到相应的租户Actor。
- 租户Actor(TenantActor):由AppActor初始化时创建,平台上每个厂商会映射到这里的TenantActor中,AppActor初始化时会查询平台上所有的厂商并为每个厂商创建一个TenantActor,
标识为TenantId(对应平台中的VendorId),租户Actor的主要作用是起到规则链隔离,可以支持单独厂商的规则链控制。TenantActor初始化时会查询当前厂商所有启用的规则链,并创建对应的RuleChainActor。
- 规则链Actor(RuleChainActor): 由TenantActor创建,负责管理一个规则链的行为,自身初始化时,会创建当前链上所有规则节点的Actor。同时管理规则节点Actor的生命周期。
- 节点Actor(RuleNodeActor):由RuleChainActor创建,负责某类规则节点的消息处理。对应当前规则链上的节点。