十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从Excel到规则引擎:用开发者最熟悉的方式理解规则管理架构

从Excel到规则引擎:用开发者最熟悉的方式理解规则管理架构 很多开发者一听到规则引擎第一反应是又是一个看起来很厉害但其实用不上的东西。但如果你换一个角度来理解——规则引擎就是把你在Excel里写的那些IF/VLOOKUP/条件格式搬到一个专门的系统里让它跑得更快、更可维护、更可扩展。你会发现这东西其实很接地气。一、从Excel到规则引擎架构演进的四个阶段阶段工具特点问题阶段1Excel IF函数简单直观人人会用规则多了公式就崩无法维护阶段2Excel VLOOKUP数据验证查表决策有基本约束多系统各存一份数据不一致阶段3代码硬编码if-else规则写在业务代码里改规则要改代码、要发版阶段4规则引擎规则独立管理可视化配置需要学习和接入成本大部分企业目前处于阶段2或阶段3。当业务复杂度到了临界点就会自然过渡到阶段4。二、规则引擎的核心架构用开发者熟悉的分层架构来理解┌─────────────────────────────────────────────────┐ │ 业务应用层 │ │ CRM / ERP / 订单系统 / 排产系统 │ └───────────────────────┬─────────────────────────┘ │ API调用 ▼ ┌─────────────────────────────────────────────────┐ │ 规则引擎层 │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ │ │ │ 规则解析器 │ │ 规则执行器 │ │ 规则管理 │ │ │ │ (Parser) │→ │ (Executor) │ │ (Admin) │ │ │ └─────────────┘ └─────────────┘ └──────────┘ │ │ ↑ ↑ ↑ │ │ └────────────────┴────────────────┘ │ │ │ │ │ ┌─────────▼─────────┐ │ │ │ 规则存储层 │ │ │ │ (Rule Store) │ │ │ └───────────────────┘ │ └─────────────────────────────────────────────────┘三个核心组件1. 规则解析器Parser把你定义的业务规则解析成可执行的逻辑。类比Excel就像Excel把你的公式解析成计算逻辑。2. 规则执行器Executor接收输入数据按照规则逻辑执行返回结果。类比Excel就像Excel根据公式和输入数据算出结果。3. 规则管理Admin规则的增删改查、版本管理、权限控制、执行日志。类比Excel就像Excel的审阅功能记录谁改了什么。三、用Python实现一个最小规则引擎为了让你直观理解我用Python实现一个最简化的规则引擎。代码不长但包含了规则引擎的核心逻辑。from typing import Any, Dict, List, Callable from dataclasses import dataclass from enum import Enum ​ ​ class Operator(Enum): 支持的操作符类比Excel的、、、AND、OR GT LT EQ GTE LTE NEQ ! AND and OR or IN in ​ ​ dataclass class Condition: 单个条件类比Excel的IF条件 例如 Condition(fieldorder_amount, operatorOperator.GT, value10000) 等价于ExcelIF(A110000, ...) field: str operator: Operator value: Any ​ ​ dataclass class Rule: 一条规则类比Excel的一行IF函数 包含 - 条件列表满足所有条件才触发 - 动作触发后执行什么 - 优先级多条规则冲突时谁优先 name: str conditions: List[Condition] action: Callable[[Dict], Any] priority: int 0 enabled: bool True ​ ​ class SimpleRuleEngine: 最小规则引擎实现 核心功能 1. 规则注册增 2. 规则删除删 3. 规则修改改 4. 规则执行查 def __init__(self): self.rules: List[Rule] [] def add_rule(self, rule: Rule): 注册一条规则 self.rules.append(rule) # 按优先级排序高优先级先执行 self.rules.sort(keylambda r: r.priority, reverseTrue) def remove_rule(self, rule_name: str): 删除一条规则 self.rules [r for r in self.rules if r.name ! rule_name] def _evaluate_condition(self, condition: Condition, data: Dict) - bool: 评估单个条件是否满足 field_value data.get(condition.field) if field_value is None: return False op condition.operator target condition.value if op Operator.GT: return field_value target elif op Operator.LT: return field_value target elif op Operator.EQ: return field_value target elif op Operator.GTE: return field_value target elif op Operator.LTE: return field_value target elif op Operator.NEQ: return field_value ! target elif op Operator.IN: return field_value in target else: return False def _evaluate_rule(self, rule: Rule, data: Dict) - bool: 评估一条规则的所有条件是否都满足AND逻辑 return all(self._evaluate_condition(c, data) for c in rule.conditions) def execute(self, data: Dict) - Any: 执行规则引擎 遍历所有规则返回第一个匹配规则的动作结果。 类比Excel从左到右遍历IF嵌套返回第一个TRUE的结果。 for rule in self.rules: if not rule.enabled: continue if self._evaluate_rule(rule, data): return rule.action(data) return None # 没有匹配的规则 ​ ​ # # 使用示例报价规则 # ​ if __name__ __main__: engine SimpleRuleEngine() # 规则1大客户折扣优先级最高 engine.add_rule(Rule( name大客户折扣, conditions[ Condition(fieldorder_amount, operatorOperator.GT, value10000), Condition(fieldcustomer_level, operatorOperator.EQ, valueVIP), ], actionlambda data: { price: data[base_price] * 0.8, # 8折 discount: VIP大客户折扣, }, priority100, )) # 规则2普通客户折扣 engine.add_rule(Rule( name普通客户折扣, conditions[ Condition(fieldorder_amount, operatorOperator.GT, value5000), ], actionlambda data: { price: data[base_price] * 0.95, # 95折 discount: 大单折扣, }, priority50, )) # 规则3标准价格兜底规则 engine.add_rule(Rule( name标准价格, conditions[], # 无条件兜底 actionlambda data: { price: data[base_price], discount: 无折扣, }, priority0, )) # 测试执行 test_cases [ {order_amount: 15000, customer_level: VIP, base_price: 100}, {order_amount: 8000, customer_level: NORMAL, base_price: 100}, {order_amount: 3000, customer_level: NORMAL, base_price: 100}, ] for data in test_cases: result engine.execute(data) print(f订单金额: {data[order_amount]}, f客户等级: {data[customer_level]}, f最终价格: {result[price]}, f折扣类型: {result[discount]})运行结果订单金额: 15000, 客户等级: VIP, 最终价格: 80.0, 折扣类型: VIP大客户折扣 订单金额: 8000, 客户等级: NORMAL, 最终价格: 95.0, 折扣类型: 大单折扣 订单金额: 3000, 客户等级: NORMAL, 最终价格: 100, 折扣类型: 无折扣看懂了吗这就是规则引擎的核心逻辑。四、生产级规则引擎的架构设计上面是一个最小实现。生产级的规则引擎还需要考虑维度最小实现生产级实现规则存储内存列表数据库 缓存规则语法Python代码DSL / 可视化配置规则版本无版本管理 回滚执行日志无全链路审计日志并发支持单线程高并发 分布式热更新需重启运行时动态更新生产级架构参考┌─────────────────────────────────────────────────────────┐ │ 业务应用层 │ │ CRM / ERP / 订单 / 排产 │ └──────────────────────────┬──────────────────────────────┘ │ gRPC / HTTP ▼ ┌─────────────────────────────────────────────────────────┐ │ 规则引擎服务 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 规则解析 │ │ 规则执行 │ │ 规则缓存 │ │ 规则管理 │ │ │ │ Service │ │ Engine │ │ (Redis) │ │ Service │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 执行引擎多模式支持 │ │ │ │ - 简单规则匹配forward chaining │ │ │ │ - 决策表Decision Table │ │ │ │ - 决策树Decision Tree │ │ │ │ - 评分卡Scorecard │ │ │ └──────────────────────────────────────────────────────┘ │ └──────────────────────────┬──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ 存储层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ MySQL │ │ Redis │ │ ES日志 │ │ │ │ 规则定义 │ │ 规则缓存 │ │ 执行日志 │ │ │ │ 版本管理 │ │ 热数据 │ │ 审计追溯 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────┘五、规则引擎的四种执行模式类比Excel的四种用法执行模式类比Excel适用场景简单规则匹配IF函数条件判断如折扣计算决策表VLOOKUP多输入多输出映射如定价策略决策树嵌套IF层级判断如风控审批评分卡SUMPRODUCT加权评分如信用评估决策表示例类比VLOOKUP# 决策表产品型号 → 工艺参数 decision_table { (产品A, 设备1): {温度: 180, 压力: 50, 时间: 30}, (产品A, 设备2): {温度: 185, 压力: 55, 时间: 28}, (产品B, 设备1): {温度: 200, 压力: 60, 时间: 25}, (产品B, 设备2): {温度: 205, 压力: 65, 时间: 23}, } ​ def lookup_decision(product: str, machine: str) - Dict: 类比Excel的VLOOKUP return decision_table.get((product, machine), {})六、技术选型对比维度自研规则引擎DroolsJavaJVS-Rules规则引擎开发语言Python/Go/JavaJava多语言支持可视化配置需自研支持支持决策表需自研支持支持决策树需自研支持支持热更新需自研支持支持版本管理需自研部分支持支持审计日志需自研需扩展支持学习成本低高中私有化部署自主可控自主可控支持写在最后规则引擎不是玄学。它的本质就是把你用Excel写的那些IF/VLOOKUP/条件格式搬到一个专门的系统里。让它跑得更快、更可维护、更可扩展、更可追溯。仅此而已。如果你还在用Excel管理业务规则或者把规则硬编码在代码里——是时候看看规则引擎了。#规则引擎 #架构设计 #Python #企业软件 #业务规则管理 #决策表 #技术选型 #数字化转型 #制造业 #代码实战
返回列表