这是一个基于 Java、高性能 Akka Actor 模型 和 Aviator表达式引擎 构建的灵活、强大的规则引擎系统。该引擎专注于高并发、复杂的业务规则定义、组合和执行,适用于需要快速决策和弹性调度的场景。
- 核心调度:基于 Akka Actor 模型:利用 Akka 的高并发、异步和容错能力,实现规则流程节点间的并行、分支和聚合的弹性调度。
- 表达式核心:基于 Aviator 引擎:提供高性能的表达式解析和执行,支持复杂的逻辑计算。
- 灵活的规则定义:支持多种操作符、组合方式和条件类型。
- 流程驱动:基于流程模型编排规则执行的逻辑和顺序。
- 自动重试机制:节点执行失败时支持配置化的自动重试策略。
- 线程安全的上下文管理:通过 FlowContext 实现节点间安全的数据共享。
规则是规则引擎的基本构建块,包含条件定义和执行逻辑。
- 基本条件:单个字段的比较操作(等于、大于、小于等)
- 复合条件:通过AND/OR组合多个子规则
- 支持的操作符:
- 比较操作符:
=、!=、<、>、<=、>= - 字符串操作符:
contains、notContains、like、notLike、beginWith、endWith等 - 集合操作符:
inCollection、notInCollection、between、notBetween - 空值判断:
isNull、isNotNull、isEmpty、isNotEmpty
规则动作定义了规则满足条件时的行为。
- 条件规则:定义触发条件的
whenRule - 满足动作:条件满足时执行的
thenActions - 不满足动作:条件不满足时执行的
otherwiseActions
规则集是规则动作的集合,支持批量管理和执行规则。
流程模型定义了规则引擎的执行流程和节点。
- 起始节点:流程的入口点
- 结束节点:流程的终止点
- 业务对象模型:定义流程中使用的数据模型
- 执行监听器:监听流程执行事件
线程安全的上下文对象,用于在多个节点间共享数据,提供并发安全的数据访问机制。
定义节点的执行逻辑,每个节点类型可以有自己的行为实现。
- 规则引擎核心 (engine)
- actor:基于 Akka 的高并发流程调度和节点编排。
- aviator:Aviator表达式执行器和自定义函数。
- rule:规则定义和规则动作模型。
- definition:流程定义和模型解析。
- runtime:流程运行时服务和上下文。
- common:公共工具和常量。
- 核心服务组件
- ProcessRunService:流程启动和执行的核心服务。
- AkkaRuleFlowScheduler:基于 Akka 的规则流程调度器。
- RuleFlowService:规则流程的持久化服务。
- Java:主要开发语言
- Akka:用于高并发流程调度的 Actor 模型框架
- Aviator:高性能表达式解析和执行引擎
- Spring Boot:服务层框架
- 规则定义:创建规则对象,设置条件和操作符。
- 流程构建:定义流程模型,通过网关节点编排串行、并行、分支和聚合逻辑。
- 流程执行:调用 ProcessRunService 启动流程实例。
- Actor 调度:AkkaRuleFlowScheduler 创建 WorkflowInstanceActor 控制流程。
- 节点执行:WorkflowInstanceActor 调度 NodeWorkerActor 执行各个节点。
- 依赖处理:通过 NodeDependencyBuilder 管理节点间依赖,支持串行和并行执行。
- 汇聚处理:处理多个并行分支的汇合逻辑。
- 自动重试:节点执行失败时自动触发配置的重试策略。
- 结果处理:根据规则执行结果执行相应的动作或输出决策。
规则引擎使用Aviator表达式引擎来执行规则表达式:
- 自动类型转换:支持数字、字符串等类型的精确计算
- 缓存机制:支持表达式缓存,提高性能
- 自定义函数:可扩展的自定义函数支持
- 上下文管理:提供表达式执行的上下文环境
- 自定义函数:实现
AviatorFunction接口,添加自定义表达式函数 - 执行监听器:添加流程执行事件监听器
- 节点行为:自定义节点执行行为
- 流程定义服务:实现
ProcessDefinitionService接口,自定义流程模型的加载方式
- JDK 17+
- Maven 3.6+
执行规则流程
- 通过 ProcessRunService 执行规则流程:
ProcessRunService processRunService = ...; // 获取服务实例
Map<String, Object> variables = new HashMap<>(); // 设置输入变量
ExcuteRuleFlowVO.Request createProcessRequest = new ExcuteRuleFlowVO.Request();
createProcessRequest.setKey("myRuleKey");
createProcessRequest.setVariables(map);
ExcuteRuleFlowVO.Response result = processRunService.excute(createProcessRequest);✅ 适用场景 (高并发、快速决策、复杂条件)
| 场景 | 核心特点 | 示例 |
|---|---|---|
| 实时风险评估 | 需要在毫秒级对大量请求进行多维度、并行判断,以快速做出“是”或“否”的决策。 | 信贷审批: 用户提交贷款申请,引擎同时检查“信用分数 > 600?”、“工作年限 > 1年?”、“负债率 < 50%?”等多个规则,快速决定是否通过。 |
| 复杂的费用核算 | 涉及多个条件分支,计算过程需要复杂的顺序和并行操作。 | 订单折扣: 计算一个订单的最终价格时,引擎同时跑“会员折扣”、“地区运费”、“满减活动”等规则,并将结果合并得出最终应付金额。 |
| 动态营销推荐 | 根据用户当前的状态或行为,在短时间内触发一系列个性化动作或推荐逻辑。 | App 消息推送: 用户打开 App,引擎快速判断:“上次登录时间超过 7 天” 或 “购物车有未付款商品”,立即推送相应的召回消息或优惠券。 |
❌ 不适用场景 (长事务、人工干预、纯数据操作)
| 场景 | 核心特点 | 示例 |
|---|---|---|
| 长事务/人工审批流 | 流程涉及需要长时间(几小时到几天)等待人工输入或审批的步骤,Akka 的优势难以发挥。 | 员工报销: 员工提交报销单,流程需要等待财务人员审核、领导签字,耗时较长,且涉及到资源锁定和持久化。 |
| 纯粹的数据存储与查询 | 流程的主要目的是简单地进行 CRUD (增删改查) 操作,没有复杂的业务判断逻辑。 | 数据归档: 定时将一年前的订单记录从在线数据库迁移到历史数据库,核心是数据迁移而非业务决策。 |
| 大规模数据批量ETL | 针对 TB 级别的数据进行清洗、转换和加载,重点在于数据吞吐量和资源管理,而非流程编排。 | 日志处理: 每晚运行程序,读取上百万条服务器日志,清洗格式,然后统一导入大数据平台。 |
以下是规则引擎的主要功能截图:
作者:黄川 ([email protected])






