作为一个开发者,在架构设计与代码优化中,可能会听到一些高大上的名词,比如说规则引擎,流程引擎,工作流程引擎等,我被这些技术弄的眼花缭乱,这几种引擎是做什么的?它们有什么区别?有这些问题,我马上去网上查找资料,去问 ChatGPT,但是网上的博客也只是对这几个“引擎”做了分别介绍,没有做一个统一的归纳,本文就是对这些概念做一次梳理,并指出它们的的设计理念与背后的设计模式,希望对你在学习规则引擎的时候有帮助。
先说结论,下面给出一张表,来对比各种”引擎“。
引擎 | 编排内容 | 设计模式 | 开源项目 | 业务落地 | 可编排人群 |
---|---|---|---|---|---|
规则引擎 | 条件编排,对象实例信息进行编排 | 策略模式 | drools | 费用计价、风控 | 开发、产品 |
流程引擎 | 操作编排,编排操作节点步骤,例如编排多个规则。 | 模版模式 | liteFlow | 单元模块节点编排 | 开发、产品 |
工作流引擎 | 流程编排,编排流程走向、状态。 | 责任链模式 | activiti | 流程审批 | 用户 |
表单引擎 | 录入编排,编排录入信息 | 适配器模式 | tDuck | 请假单,活动模板。 | 开发 |
策略模式-规则引擎
在日常开发中,使用作为条件判断的 if else 不可避免,在条件判断内容比较少时可能不会引起注意,但是在条件判断复杂时,堆叠、嵌套太多的 if else 会让代码的可读性与可维护性,在我的日常开发中,单判断条件在 3 个以下时,我会使用 if else,当在 3 至 5 个时,我会使用 switch 关键字作为条件判断,当有 5 至 10 个条件判断时,我会使用策略模式解决 if 过多的问题,当拓展至无上限的条件判断时,我就会使用规则引擎了。所以我使用规则引擎的目的就是解决 if else 过多的问题。 当然,规则引擎的应用场景不仅仅是前面那些,下面给出一些经典的业务应用场景:
业务领域 | 示例 |
---|---|
财务决策 | 贷款发放,征信系统 |
库存管理 | 及时的供应链路 |
票价计算 | 航空,传播,火车及其他公共汽车运输 |
生产采购系统 | 产品原材料采购管理 |
风控系统 | 风控规则计算,风险评估 |
促销平台系统 | 满减,打折,加价购 |
反欺诈项目 | 银行贷款、征信验证 |
资质系统 | 供应链、商家资质 |
做一点总结的话,规则引擎做无状态的“规则”判定,与规则引擎的上下文状态无关,只对参数有关。规则引擎中比较知名的开源框架是drools,这是一篇我觉得还不错的drools中文入门教程:https://www.cnblogs.com/ityml/p/15993391.html。规则引擎的编辑,常常使开发或者产品进行编排,控制详细的条件约束。
模版模式-流程引擎
使用流程引擎是为了编排单元化的模块节点,比如用户在进行抽奖操作时,以传统的硬编码的方式是把抽奖方法的每一步骤操作是一步一步写,使用这种方法是模块的复用性与扩展性不足,写出的代码难以维护,在进行抽奖操作时,会进行一致性校验、活动准入、风控检查、库存检查、抽奖、奖励发放等步骤,但是另一个活动不需要进行风控检查,或者不需要进行库存检查、这个抽奖接口就不能复用了,想要扩展这个接口只能根据不同的业务区分不同的抽奖策略,或者 copy 出来一个抽奖接口,去掉其中的库存、风控校验。显然这样的代码可维护性很差,以后要同时维护两个或者跟多的抽奖接口。引入抽奖引擎后可以将前面说到的流程编排化,当在执行不同的抽奖时,只需要前面的各种步骤抽出单元模块来,可以编排出不同的抽奖流程来,以此来维护代码的可维护性。流程引擎所使用的设计模式跟模版模式很像、使流程按不同的模版执行,也跟责任链模式很像,编排一条责任链,节点链式执行。
与规则引擎编排条件不同,流程引擎跟多的是编排执行步骤。一个可以帮助区分的是,流程引擎编排步骤,这些具体的步骤里使用的规则引擎进行条件判断,进行内容条件处理。流程引擎的编辑,常常使开发或者产品进行编排,控制操作的具体执行内容。
流程引擎比较知名的开源框架是LiteFlow,其官网的文档就很适合学习:https://liteflow.cc/pages/5816c5/
小结
规则引擎与流程引擎在的差异体现在,规则引擎以过程为导向,根据一些条件,得出一个结果,复杂度体现在条件的组合;流程引擎以结果为导向,根据一个结果,需要执行那些流程;复杂度在于流程执行的内容。举个例子,根据一些特征,四条腿,身上有毛,跑得快,耐力好等条件,可以得出它是一匹马,这是规则引擎,反之根据一匹马,它会做吃草,跑步,站立睡觉等行为,这是马会执行的一些流程,这是流程引擎。
责任链模式-工作流引擎
工作流引擎常常跟流程引擎混淆,因为在设计审批流程处理时,常常使用工作流引擎,“审批流程”与流程引擎在字面上有几分相似,但是其中相差还是挺大的,与前面提到的流程引擎不同,工作流引擎真的使用在“工作”中,比如请假审批、权限申请中,能够编辑各种审批节点,比如说流程的会签、或签,流程退回等操作。可见这种“工作流”的编辑,完全交由用户手中。与规则引擎和流程引擎不同,工作流引擎的执行内容是有状态的,依赖上下游节点的内容,才能进行正确的处理。
一篇很不错的工作流引擎学习文档是:https://www.cnblogs.com/duck-and-duck/p/14436373.html
适配器模式-表单引擎
表单引擎并不是通俗意义上的引擎,你可能听都没听过,这是我自己想出来的一个概念,它也跟编排内容有关,就放在这篇文章了。
在业务开发中,前端与后端的交互,后端之间的交互,参数往往难以统一,在一个成熟的业务开发系统中,其参数可以是固定的,也可能会在业务扩展与功能迭代中加几个参数,加参数的一个不好影响是需要做代码之间的兼容,或者常常是仅仅加了一个参数之后就要测试,发版,这会影响项目迭代效率,所以我设计了一个“表单引擎”,用来处理各种异构数据模型参数的校验、转换。这些参数的流转,校验也可以实现编排化,使用Map数据结构来接收前端传入的参数,使用前面提到的规则引擎进行校验,使用 JsonPath 技术进行后端异构数据模型参数的转化,更进一步可以由后端的编排配置来控制前端的组件展示,来实现表单录入的灵活编排。
表单引擎是我自己想出来的概念,所以并没有开源框架可供学习;了解前面表单引擎的内容后,可以拿它套进一个设计模式中去---适配器模式,使用适配器设计模式的思想,来适配上下游不同的参数。
优秀的架构师,即使是业务要求快速上线,也留好了充分的扩展空间。
参考链接
- 老板要我开发一个简单的工作流引擎:https://www.cnblogs.com/duck-and-duck/p/14436373.html
- 理解规则引擎,让代码更容易维护:https://www.bilibili.com/video/BV1mg4y1R7WP
- 规则引擎框架LiteFlow:https://zhuanlan.zhihu.com/p/514881728
- 学会用规则引擎Drools:https://juejin.cn/post/7208968811389665338
- Drools 规则引擎应用 看这一篇就够了:https://www.cnblogs.com/ityml/p/15993391.html
- LiteFlow官网:https://liteflow.cc/pages/5816c5/