知识卡片

规则引擎应对海量组合规则的三个理由,及对微内核三设计点的映射

结构图卡

内容

规则引擎从结构上看也是[[微内核架构的三个设计关键点:插件管理、连接与通信]]的一种具体实现,执行引擎相当于微内核,负责解析配置好的业务流、执行其中的条件和规则。规则引擎在计费、保险、促销这类业务领域应用广泛,以电商促销为例,常见规则有”满100送50”“3件立减50”“3件8折”“第3件免费”“跨店满200减100”“新用户立减50”等,实际业务里完整列下来可能有几十上百种,再叠加各种排列组合,促销方案可能达到几百上千种——这种规模的业务如果完全靠写代码硬编码,开发效率根本跟不上业务变化的速度,而规则引擎能很好地应对这类需求,原因有三层:可扩展——引入规则引擎后业务逻辑和业务系统本身分离,扩展新业务功能不需要改动业务系统代码;易理解——规则用接近自然语言的方式描述,业务人员自己就能理解和操作,不像代码那样只有程序员才懂;高效率——规则引擎系统通常提供可视化的规则定制、审批、查询、管理界面,业务人员能自己快速配置新规则。规则引擎的运作流程是:开发人员把业务功能拆解提炼成多条规则、存入规则库;业务人员根据实际需要把这些规则排列组合、配置成业务流程、存入业务库;规则引擎读取执行这些业务流程来实现具体的业务功能。对照微内核架构的三个设计点:插件管理对应规则库——规则就是微内核架构里的插件、引擎就是内核,规则可以被引擎加载执行,规则通常存在数据库里;插件连接对应规则语言——就像程序员开发要用Java、C++这类语言,规则引擎也规定了专属的规则语言,业务人员基于这套语言编写规则文件,交由引擎加载执行,这套规则语言本身就是插件连接机制;插件通信对应数据流和事件流——因为单条规则不需要主动依赖其他规则,规则之间没有主动通信,每条规则只负责输出数据或事件,由引擎负责把这些数据/事件传递给下一条规则。目前最常用的开源规则引擎是JBoss Drools,用Java编写、基于Rete算法,社区活跃、执行速度快、兼容Java Rule Engine API(JSR-94),还提供基于Web的规则管理知识库Guvnor(支持版本控制和在线修改编译);但Drools号称简单易用,实际上其规则语言依然和编程语言比较接近,普通业务人员直接上手学习和理解成本仍然偏高,因此实践中通常需要在Drools基础上再做一层封装,把规则配置做成真正可视化的操作界面。

结构图

flowchart TB
  A["规则引擎为何能应对海量组合规则"]
  A --> B["可扩展:业务逻辑与业务系统分离"]
  A --> C["易理解:接近自然语言,业务人员可读"]
  A --> D["高效率:可视化配置/审批/查询/管理"]
  B --> E["规则引擎运作流程:<br/>开发拆解规则入规则库<br/>→业务人员组合配置成业务流程入业务库<br/>→引擎执行"]
  C --> E
  D --> E
  E --> F["对照微内核三设计点"]
  F --> F1["插件管理→规则库(规则=插件,引擎=内核)"]
  F --> F2["插件连接→规则语言(专属DSL)"]
  F --> F3["插件通信→数据流/事件流(引擎负责传递)"]

参考来源

- 位置:《从零开始学架构》第37讲《微内核架构详解》"规则引擎架构简析"(源文件:_epub-src/OEBPS/text00003.html) - 结论依据:原文说明规则引擎"可扩展……易理解……高效率"三点原因,并逐一对照"插件管理……规则一般保存在规则库中……插件连接……规则引擎的插件连接实现机制其实就是规则语言……插件通信……规则只需要输出数据或者事件,由引擎将数据或者事件传递到下一个规则",直接支撑本卡片结论与结构图。 - 原始内容:可扩展……易理解……高效率……规则引擎中的规则就是微内核架构的插件,引擎就是微内核架构的内核……规则引擎的插件连接实现机制其实就是规则语言……规则只需要输出数据或者事件,由引擎将数据或者事件传递到下一个规则。