# 规则引擎设计文档

## 实现模型
规则引擎底层实现基于actor模型设计

Actor模型有两种任务调度方式：基于线程的调度、基于事件的调度

基于线程的调度
为每个Actor分配一个线程，在接收一个消息时，如果当前Actor的邮箱为空则会阻塞当前线程。基于线程的调度实现较为简单，但线程数量受到操作的限制，现在的Actor模型一般不采用这种方式。
基于事件的调度

事件可以理解为任务或消息的到来，而此时才会为Actor的任务分配线程并执行。

因此，可以把系统中所有事物都抽象成为一个Actor：

Actor的输入是接收到的消息

Actor接收到消息后处理消息中定义的任务

Actor处理完成任务后可以发送消息给其它Actor

### actor模型原理图
![avatar](assets/1614828236440.jpg)


### 内部架构部件

具体的消息流转过程见下图

![avatar](assets/trans.jpg)


基于以上理论，规则引擎抽象出了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创建，负责某类规则节点的消息处理。对应当前规则链上的节点。

