规则引擎核心
引用文件
目录
简介
本文件面向规则引擎核心功能的技术文档,聚焦于 LiteFlow 规则引擎在业务系统中的集成与落地,涵盖以下主题:
- FlowExecutor 的使用与规则链执行流程
- 规则匹配算法与候选规则筛选逻辑
- 设备上下文 DeviceContext 的设计理念与数据结构
- 规则执行完整流程:候选规则获取、规则条件判断、业务 ID 提取
- 规则引擎配置参数说明与性能优化建议
- 实际使用场景与代码路径指引
项目结构
规则引擎相关代码主要位于 yudao-module-rule 模块的 API 层,包含工具类、上下文、DAO、API 接口、自动配置与缓存常量等。
图表来源
- RuleRunUtil.java
- DeviceContext.java
- DeviceContextUtil.java
- ApiLiteflowChainRedisDAO.java
- RuleBusinessApi.java
- RuleComponentAutoConfiguration.java
- CacheConstants.java
- RuleConstants.java
章节来源
核心组件
- RuleRunUtil:规则运行主入口,负责三级缓存查询、候选规则筛选、规则链执行、业务 ID 提取与数量限制检查。
- DeviceContext:设备上下文扩展,继承设备响应 DTO 并增加 properties、心跳时间等字段,便于规则节点读取。
- ApiLiteflowChainRedisDAO:Redis 缓存访问层,提供规则详情、规则集合、业务 ID 集合、数量限制等缓存读写。
- RuleBusinessApi:Feign 接口,定义与规则业务系统的 RPC 交互方法。
- RuleComponentAutoConfiguration:自动装配 LiteFlow 组件与事件扫描,使其他模块可加载 rule-api 中的组件。
- CacheConstants:统一缓存键前缀与本地缓存键规范,支撑多级缓存策略。
- RuleConstants:规则引擎相关常量,如应用名等。
章节来源
- RuleRunUtil.java
- DeviceContext.java
- ApiLiteflowChainRedisDAO.java
- RuleBusinessApi.java
- RuleComponentAutoConfiguration.java
- CacheConstants.java
- RuleConstants.java
架构总览
规则引擎整体采用“三级缓存 + 分布式锁”的读路径,结合 LiteFlow 规则链执行器完成规则匹配与业务 ID 提取。
图表来源
详细组件分析
RuleRunUtil:规则运行与执行编排
- 三级缓存策略:本地缓存 -> Redis -> 数据库,结合分布式锁避免缓存击穿。
- 候选规则筛选:基于 MAC 专属规则、业务类型规则、渠道规则、无设备 限制规则进行集合运算,得到候选集。
- 规则链执行:通过 FlowExecutor.execute2Resp 执行 LiteFlow 规则链,传入 DeviceContext 上下文。
- 业务 ID 提取:对匹配成功的规则,按规则+业务类型查询业务 ID 集合,并支持数量限制检查。
- 防穿透占位符:当数据库无数据时,Redis 写入占位符以降低缓存穿透风险。
图表来源
章节来源
- RuleRunUtil.java
- RuleRunUtil.java
- RuleRunUtil.java
- RuleRunUtil.java
- RuleRunUtil.java
- RuleRunUtil.java
DeviceContext:设备上下文设计与数据结构
- 继承自设备响应 DTO,复用设备字段,同时新增 properties 映射、心跳时间 heartbeatTime 与标记 hasHeartbeatUpdated。
- 通过构造函数将设备 DTO 转换为 Map,便于规则节点直接读取任意设备属性。
- 心跳时间仅在规则节点实际使用时懒加载,避免不必要的 IO。
图表来源
章节来源
ApiLiteflowChainRedisDAO:缓存访问层
- 提供规则详情、规则集合、业务 ID 集合、数量限制等缓存读写方法。
- 使用随机过期时间与占位符机制,提升缓存命中率与一致性。
- 提供本地缓存清理事件发送,确保多节点一致性。
章节来源
RuleBusinessApi:业务交互接口
- Feign 接口,定义规则引擎与业务系统的 RPC 方法,如按 MAC/业务类型/渠道获取规则 ID、按规则+业务类型获取业务 ID、获取规则详情、数量限制等。
- 通过 fallbackFactory 提供降级能力,保障系统稳定性。
章节来源
RuleComponentAutoConfiguration:组件自动配置
- 自动扫描 rule-api 中的 LiteFlow 组件与事件,使其他模块(如 task-server)可加载这些组件。
章节来源
缓存常量与规则常量
- CacheConstants:统一 Redis 缓存键命名规范,区分集合、哈希与普通键;同时定义本地缓存键,避免 SpEL 解析问题。
- RuleConstants:规则引擎相关常量,如应用名等。
章节来源
依赖分析
- RuleRunUtil 依赖 FlowExecutor(Spring Bean)、ApiLiteflowChainRedisDAO、RuleBusinessApi、DeviceContext、CacheConstants。
- ApiLiteflowChainRedisDAO 依赖 RedisClient 与 CacheConstants。
- RuleBusinessApi 为 Feign 接口,依赖 ApiConstants。
- RuleComponentAutoConfiguration 依赖组件扫描与事件扫描。
图表来源
章节来源
性能考虑
- 三级缓存策略:优先本地缓存,其次 Redis,最后数据库,减少后端压力。
- 分布式锁:缓存未命中时加锁查询数据库,避免缓存击穿。
- 随机过期时间:降低缓存雪崩概率。
- 防穿透占位符:当数据库无数据时写入占位符,减少后续重复查询。
- 本地缓存清理事件:通过事件广播清理多节点本地缓存,保证最终一致性。
- 规则链执行:仅对候选规则执行,避免全量扫描。
- 数量限制检查:优先使用本地缓存,必要时再查 Redis/DB。
章节来源
故障排查指南
- 规则链执行失败:检查 FlowExecutor Bean 是否存在,确认 chainName 是否正确,查看日志输出的响应消息。
- 候选规则为空:确认 MAC/业务类型/渠道/无限制规则缓存是否正确,检查 Redis 中对应键是否存在。
- 数量限制异常:确认业务数量限制缓存是否命中,检查占位符与本地缓存清理事件是否正常触发。
- 分布式锁竞争:观察锁等待与释放日志,适当调整锁超时时间。
- 设备信息刷新:可通过配置项控制是否在规则执行时重新从设备中心拉取设备信息。
章节来源
结论
本规则引擎方案通过“三级缓存 + 分布式锁”与 LiteFlow 规则链执行器,实现了高性能、可扩展的规则匹配与业务 ID 提取能力。DeviceContext 作为上下文载体,提供了灵活的数据访问方式;配合统一的缓存常量与自动配置,降低了模块间的耦合度。建议在生产环境中结合监控与告警,持续优化缓存命中率与规则链执行效率。
附录
配置参数说明
- liteflow.getDeviceOnRule:布尔型,控制规则执行时是否重新从设备中心拉取设备信息。默认关闭,避免额外 IO。
章节来源
使用场景与代码路径
- 规则匹配入口:matchBusinessIds
- 候选规则筛选:getCandidateRuleIds
- 规则链执行:executeRuleMatching
- 业务 ID 提取与数量限制:getBusinessIdsByRules
- 缓存读写:ApiLiteflowChainRedisDAO
- 设备上下文构建:DeviceContext 构造函数