|
@@ -0,0 +1,41 @@
|
|
|
|
+# 规则引擎设计文档
|
|
|
|
+
|
|
|
|
+## 实现模型
|
|
|
|
+规则引擎底层实现基于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创建,负责某类规则节点的消息处理。对应当前规则链上的节点。
|
|
|
|
+
|