流程引擎和规则引擎技术实现
--------------------------------------------------------------------------------------------------------------
流程引擎与规则引擎:技术实现全解析
一、流程引擎(Workflow Engine)技术实现
1. 核心概念与模型
- 流程定义(Process Definition):静态模板,遵循BPMN 2.0标准,用 XML/JSON 描述节点、流转线、条件、任务类型、参与者、监听器。
- 流程实例(Process Instance):流程定义的运行时对象,一个定义可创建 N 个实例,存储当前状态、变量、执行上下文。
- 任务(Task):流程执行单元,分用户任务(人工审批)、服务任务(自动调用接口 / 脚本)、网关(排他 / 并行 / 包容 / 事件网关)、子流程、边界事件(超时、异常、消息)。
- 状态机模型:核心是
当前状态 + 触发动作 = 下一状态,引擎校验流转合法性、管理生命周期。
2. 整体架构(分层设计)
- 建模层
- 可视化设计器(Vue/React+BPMN-JS):拖拽编辑、校验、导出 BPMN/JSON。
- 解析器:将 BPMN XML 转为内存对象模型或AST 抽象语法树。
- 核心引擎层
- 执行器:驱动实例流转、处理网关分支 / 聚合、触发任务、调用服务。
- 任务管理器:创建 / 分配 / 完成 / 查询任务、处理代办 / 已办、支持会签 / 或签 / 转办。
- 变量管理器:存储流程 / 任务 / 局部变量、支持基本类型 / 对象 / 集合、事务隔离。
- 事件总线:监听流程 / 任务 / 变量事件(启动 / 完成 / 异常)、支持同步 / 异步、集成消息队列。
- 调度器:处理定时任务 / 边界超时事件(Quartz/XXL-Job + 分布式锁)。
- 持久化层
- 核心表:
ACT_RE_PROCDEF(流程定义)、ACT_RU_EXECUTION(运行实例)、ACT_RU_TASK(运行任务)、ACT_HI_PROCINST(历史实例)、ACT_HI_TASK(历史任务)、ACT_GE_BYTEARRAY(资源文件)。 - 存储:MySQL/Oracle/PostgreSQL/ 国产数据库(达梦、人大金仓)。
- 核心表:
- API 与集成层
- 核心 API:
startProcessInstance、completeTask、claimTask、getProcessVariables。 - 集成:REST/gRPC、Spring/SpringBoot、消息队列(Kafka/RocketMQ)。
- 核心 API:
3. 两种执行模式
- 解释模式(Interpreted):Activiti 5/6、Flowable 5/6
- 实现:运行时逐节点解析 BPMN、反射执行。
- 优点:支持热部署、动态修改流程定义。
- 缺点:性能较低、执行路径不可见。
- 编译模式(Compiled):Camunda、Activiti 7、Zeebe、CompileFlow
- 实现:部署时将 BPMN 编译为Java 字节码 / 状态机代码、原生执行。
- 优点:性能高、类型安全、可静态校验。
- 缺点:修改需重新编译、热部署复杂。
4. 核心技术要点
- 流转控制
- 排他网关:
conditionExpression(EL 表达式)判断流转。 - 并行网关:拆分多分支、全部完成后聚合。
- 循环节点:基于条件重复执行。
- 排他网关:
- 任务分配策略
- 静态分配:固定用户 / 角色。
- 动态分配:表达式、监听器、业务规则、候选人 / 组。
- 会签:
multiInstance、完成比例 / 数量判断。
- 分布式与高可用
- 无状态设计、集群部署、Redis 共享状态。
- 乐观锁防并发冲突、分布式任务调度。
- 事件溯源(Zeebe):记录所有事件、可重放恢复状态。
- 事务与一致性
- 流程操作与业务数据同事务(Spring Transaction)。
- 异常处理:回滚、补偿机制、失败重试。
5. 主流实现与代码示例(Java)
- Activiti/Flowable
// 1. 初始化引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
RuntimeService runtimeService = engine.getRuntimeService();
// 2. 启动流程
runtimeService.startProcessInstanceByKey("leaveProcess", variables);
// 3. 查询并完成任务
List<Task> tasks = taskService.createTaskQuery().taskAssignee("zhangsan").list();
for (Task task : tasks) {
taskService.complete(task.getId(), variables);
}
- CompileFlow(编译型)
// 流程定义(TBBPM)→ 编译为Java类 → 执行
ProcessEngine engine = ProcessEngine.newInstance();
ProcessResult result = engine.execute("leaveProcess", variables);
二、规则引擎(Rule Engine)技术实现
1. 核心原理:产生式规则系统
- 规则结构:
IF 条件(Condition) THEN 动作(Action)。 - 核心三组件
- 规则库(Rule Base):存储所有规则、支持版本 / 灰度 / 权限。
- 工作内存(Working Memory):存放输入事实(Fact)(业务数据)。
- 推理引擎(Inference Engine):匹配事实与规则、解决冲突、执行动作。
2. 整体架构
- 规则建模层
- 规则集:IF-THEN 脚本(DRL/DSL)。
- 决策表 / 决策矩阵:表格化配置。
- 决策树:可视化分支决策。
- 评分卡:金融风控打分。
- 规则编译层
- 词法 / 语法解析(ANTLR):生成 AST。
- 优化:合并条件、共享节点、生成Rete 网络。
- 推理执行层
- 模式匹配器:核心算法(Rete/LEAPS/Phreak)。
- 议程(Agenda):存储匹配规则、按优先级排序。
- 冲突解决策略:优先级、最近激活、复杂度、事实顺序。
- 执行器:执行规则动作(修改事实、调用 API、返回结果)。
- 扩展层
- 函数库、脚本支持(Groovy/JS)、外部服务调用、监控审计。
3. 核心算法:Rete 算法(关键)
- 思想:空间换时间,构建Rete 网络(条件节点有向无环图),共享重复条件、缓存中间匹配结果、避免全量重复匹配。
- 网络结构
- 根节点:事实入口。
- 类型节点:按事实类型过滤。
- Alpha 节点:单条件匹配(如
age>18)。 - Beta 节点:多条件联合(AND/OR)、连接不同事实。
- 终止节点:规则触发、加入议程。
- 执行流程
- 事实插入→传播网络→匹配 Alpha/Beta 节点。
- 完全匹配→加入议程。
- 按策略执行→修改事实→重新触发匹配(前向链推理)。
4. 两种推理模式
- 前向链(Forward Chaining):数据→规则→结论(Drools),适合实时决策 / 风控 / 促销。
- 后向链(Backward Chaining):目标→找条件→验证(Prolog),适合查询 / 诊断 / 专家系统。
5. 技术实现要点
- 规则语言与 DSL
- DRL(Drools Rule Language):
droolsrule "discount-diamond" salience 10 // 优先级 when $order: Order(level == "DIAMOND", amount > 1000) then $order.setDiscount(0.2); // 8折 end - 冲突解决
salience(优先级)、activation-group、agenda-group。
- 性能优化
- Rete 网络共享、事实索引、惰性评估、规则分组、热点缓存。
- 分布式规则引擎
- 规则中心统一管理、客户端本地缓存、推送更新、集群执行。
6. 主流实现与代码示例(Drools)
// 1. 初始化Kie容器
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("discount-session");
// 2. 插入事实
Order order = new Order("DIAMOND", new BigDecimal("2000"));
kieSession.insert(order);
// 3. 执行规则
int fired = kieSession.fireAllRules();
System.out.println("触发规则数:" + fired);
System.out.println("折扣后金额:" + order.getFinalAmount());
// 4. 关闭会话
kieSession.dispose();
三、流程引擎 + 规则引擎:融合实现(最佳实践)
1. 典型场景:费用报销
- 流程引擎:提交→部门审批→财务审核→出纳支付。
- 规则引擎(财务节点)
- 规则 1:
IF 招待费>2000 AND 无客户信息 THEN 驳回。 - 规则 2:
IF 金额>50000 THEN 需CEO审批。 - 规则 3:
IF 差旅超标 THEN 标记异常。
- 规则 1:
2. 集成方式
- 嵌入式:流程节点直接调用规则引擎 API(强耦合)。
- 服务化:规则引擎独立部署、流程通过 HTTP/gRPC 调用(解耦)。
- 规则流:规则引擎内置流程、用规则驱动流转(轻量流程)。
3. 技术价值
- 业务逻辑解耦:流程与规则分离、独立变更、不发版。
- 动态灵活:规则可视化配置、实时生效。
- 复用性:规则跨流程复用、降低重复开发。
- 可审计:流程轨迹 + 规则执行日志、全链路追溯。
四、技术选型对比
| 维度 | 流程引擎 | 规则引擎 |
|---|---|---|
| 核心目标 | 控制流程流转、任务调度、状态管理 | 业务决策、条件判断、逻辑推理 |
| 数据模型 | 流程定义、实例、任务、状态机 | 规则库、事实、Rete 网络、议程 |
| 核心算法 | 状态机、有向图遍历、网关逻辑 | Rete/LEAPS、模式匹配、前向推理 |
| 执行模式 | 步骤驱动、顺序 / 分支 / 并行 | 数据驱动、多规则匹配、冲突解决 |
| 主流框架 | Activiti、Flowable、Camunda、Zeebe | Drools、URule Pro、Easy Rules |
| 应用场景 | 审批流、订单流程、工单系统、业务协同 | 风控、促销、授信、合规检查、评分 |
五、总结与落地建议
- 流程引擎本质是标准化的状态机与任务调度系统,核心是流转控制与任务管理,适合长周期、多节点、强协作的业务流程。
- 规则引擎本质是高效的模式匹配与推理系统,核心是业务逻辑解耦与动态决策,适合规则多变、复杂判断、高并发决策场景。
- 落地路径:先梳理流程→抽取节点内规则→流程引擎控流转、规则引擎管决策→统一监控与运维→支持动态配置与热更新。
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号