暗无天日

=============>DarkSun的个人博客

读:规则引擎——从 if-else 到业务规则管理

开篇:if-else 的尽头

大部分软件的业务逻辑都是从几行 if-else 开始的。然后需求雪球越滚越大:新促销、合规调整、用户分层……等回过神来,代码已经复杂到改一个折扣条件要翻遍整个代码库,怕改漏了,怕影响不相干的逻辑。

这种痛我猜大部分后端开发都经历过。规则引擎(Rule Engine)这个听起来有点年代感的概念,就是为这个场景设计的。

在 DZone 上读了一篇介绍(How Rule Engines Transform Business Agility and Code Simplicity,作者 Venkatesh S),把规则引擎的适用场景和边界讲得比较实在。这篇笔记记下关键点和自己的理解。

规则引擎是什么:三句话

第一句:规则引擎把 IF-THEN 从代码里搬到代码外。

第二句:还是 IF-THEN,只是不用在 Java/Python/Clojure 里写 if-else 了,改成在配置文件或管理界面里写 IF customer.tier = 'GOLD' AND order.total > 100 THEN apply 15% discount

第三句:非开发者也能改这些规则。运营想改折扣、合规想调整审批门槛、风控想加一个新检测规则,他们自己改,不用等你排期。

这三句话够用了。Drools 的 Rete 算法、前向链后向链、推理引擎怎么匹配规则,这些等真正需要的时候再了解也不迟。

规则引擎的决策框架

什么时候该上规则引擎,什么时候不该,原文给了一些判断标准,整理成四问:

你的规则变化有多频繁 :规则每周都在变(促销活动、合规政策、风控策略)→ 值得考虑。规则一年改一两次 → 不需要,if-else 更直接。

非技术人员有没有能力改规则 :运营/合规的人能写 IF score > threshold 这种级别的条件 → 上了规则引擎确实能减少你的负担。他们连 CSV 都填不利索 → 上了规则引擎最后也是你改,白多一层复杂度。

性能要求多高 :规则引擎运行时做模式匹配,比硬编码的 if-else 慢一个数量级。高并发低延迟的场景(如实时支付风控)需要谨慎评估。批处理、后台审核这类场景无所谓。

规则的规模有多大 :10 条以下的规则 → if-else 是正确答案。200 条以上 → 规则引擎的收益开始显现,硬编码的复杂性已经失控。10 到 200 条之间是灰色地带,具体情况具体分析。

原文还列了一张对比表,把传统方式(硬编码逻辑)和规则引擎方式对比得更全面:

维度 硬编码 规则引擎
变更速度 改代码+测试+部署,论周算 业务人员在 UI 上改,论小时算
业务方参与 开发者当传话筒 领域专家直接管理规则
复杂度上限 10--20 个条件就难维护了 1000+ 条件也能管
审计追踪 逻辑散在代码里,难查决策历史 规则有版本号,谁改了什么一目了然
测试影响 改一次全面回归 规则可以单独测
出错风险 改复杂条件容易引入 bug 规则独立,改一个不影响其他
团队效率 开发者整天改业务逻辑 开发者专注平台能力

框架生态速览

规则引擎的生态很丰富,但说实话大部分场景不需要纠结选哪个,了解几个就够了:

  • Drools :Java 生态的老大哥,功能最全但也最重。大型企业级场景首选
  • Easy Rules :轻量级 Java 规则引擎,如果你的需求不复杂可以试试这个
  • JSON Rules Engine :规则用 JSON 写,和语言无关。适合想把规则存数据库或通过 API 管理的场景
  • DMN(Decision Model and Notation) :OMG 标准的决策模型表示法,用 Camunda 等流程引擎可以执行。适合需要跨组织和跨工具协作决策逻辑的场景

选框架的核心不是功能对比,而是:你的规则将来由谁维护、用什么工具改、想把这层逻辑放在代码里还是外部系统里。

总结

规则引擎不是银弹。它做的是一笔交易:用一层"规则管理层"替换代码里的散装 if-else。这笔交易值不值,取决于规则的变动频率、维护者的动手能力、以及对性能的容忍度。

对于大多数项目来说,最优解可能不是"全上规则引擎"也不是"全用 if-else",而是在业务逻辑最密集、变化最快的部分划出边界,用规则引擎管理起来。其他地方继续用常规代码。

规则引擎 : 设计模式 : 架构