关于规则引擎的思考(1)
规则引擎是什么?
先看一类文章,为什么要用规则引擎
https://www.cnblogs.com/rjzheng/p/10996186.html https://www.jianshu.com/p/9b67ab434795
先看一类文章,为什么不需要规则引擎
https://www.yinwang.org/blog-cn/2017/05/25/dsl https://www.jianshu.com/p/d136a76e1c0d
第一类的文章使用规则引擎相当于把 if else 数据化,复杂程度没有降低,只是转移了,为了规则引擎而规则引擎。
由静态语言转向数据,可以热加载热更新,这才是真正的需求。
而第二类文章所说复杂规则引擎,必然引入DSL,相当于一个冷门的语言,不但复杂度没降低,熟悉它的成本反而升高,得不偿失。仅为了热加载或解耦不如用脚本。
规则引擎的功能是什么?
假设一下:
如果没有需求的限制,需要灵活的功能大而全的规则引擎,那么最后这个规则引擎就会变成Drools,甚至脚本语言。
一种靠解析器执行的以决策树为主的东西。如果说因为Hard Code复杂,换成Drools的话,非程序员也无法使用Drools,所以规则引擎可以降低逻辑复杂度是一个悖论。
那么,通常情况下,我们只需要一个脚本语言,Lua或者Python,这个语言可以完成热加载,有逻辑表达即可。
再进一步说一下语言表达和规则表达的区别,规则主要是匹配逻辑,if else,即语言中的 “逻辑”(控制) 部分,程序语言中还有 “累加”(计算),“变量” (数据),看看是不是用得到。
考虑完以上问题后:几个著名规则引擎 or DSL。
-
ACL只用于包过滤:输入是网络包文,输出是一个动作
-
SQL只用于数据操作和分析:输入是表达式,输出表达式结果
-
eBPF: 算是引擎,DSL都算不上,汇编代码啊。
-
TOML/YAML:连规则都算不上,DSL配置吧。
我们回到在特定问题域,特定需求范围下探讨规则引擎 / DSL / 配置文件来驱动逻辑。
规则引擎 is Nothing
所以“规则引擎”没有狭义的概念和实现,还是需要从需求考虑:
是注重人机交互,提供交互UI,降低用户使用难度?
还是为了数据驱动逻辑,分离数据与执行?
还是为了热更新,热加载?
还是只想碰“词”
结论:“规则引擎”是抽象的功能需求,并不是一个具体的技术方案,更不是指导开发实现的特定方法。