4. 规则配置入门:规则创建流程、规则版本管理、规则生效时间配置

好,咱们今天正式进入动手环节。前面几章聊的都是策略引擎的架构和设计理念,说白了就是「纸上谈兵」。从这一章开始,我们要真正去配置一条规则,让它跑起来。

规则配置这件事,看起来就是填几个表单、写几行条件。但我在项目中见过太多人栽在细节上——版本搞混了、生效时间没算对、规则上线了才发现条件写反了。嗯,这些坑我都踩过。今天我把整个流程拆开,带着你一步步走一遍。

4.1 规则创建流程:从需求到上线

一条规则的生命周期,通常包含五个阶段。我习惯把它画成一张流程图,方便团队对齐。

规则创建与上线流程 需求分析 条件编写 本地测试 灰度发布 全量上线 条件调整 💡 关键原则 • 每条规则必须有明确的业务场景描述,不能只有技术条件 • 灰度发布阶段至少运行 24 小时,观察数据是否符合预期 • 全量上线后保留灰度版本 7 天,方便快速回滚

你看,这个流程里有一个很容易被忽略的环节——条件调整的回退箭头。我曾经带过一个项目,开发同学写完规则直接提上线,结果线上跑了一天才发现条件里的金额单位写错了。从那以后,我要求团队必须走完「本地测试 → 灰度发布」这个闭环,哪怕只是改一个数字。

4.1.1 需求分析阶段

这个阶段不写代码,只写文档。你需要回答三个问题:

  • 触发时机:规则在什么时候被调用?是用户下单时、还款时、还是每天定时跑批?
  • 输入数据:规则需要哪些字段?用户等级、订单金额、历史行为?
  • 输出动作:规则命中后做什么?是拒绝、打标、还是调整利率?

我的习惯:用一张表格把这三个问题列出来,发给业务方确认签字。别嫌麻烦,我吃过「口头需求」的亏——业务说「很简单,就加个判断」,结果上线后才发现漏了两个关键字段。

4.1.2 条件编写与本地测试

条件编写是规则配置的核心。我们用一个实际例子来说明。假设有一条风控规则:

规则名称:高风险订单拦截
触发时机:用户提交订单时
条件:
  - 订单金额 > 5000
  - 用户注册天数 < 30
  - 用户历史订单数 < 3
动作:拒绝订单,返回原因码 R1001

在策略引擎中,这条规则通常写成 JSON 或 YAML 格式。我个人偏好 JSON,因为结构清晰,方便做版本对比。

{
  "ruleId": "RULE_001",
  "name": "高风险订单拦截",
  "trigger": "ON_ORDER_SUBMIT",
  "conditions": {
    "operator": "AND",
    "items": [
      { "field": "orderAmount", "operator": "GT", "value": 5000 },
      { "field": "regDays", "operator": "LT", "value": 30 },
      { "field": "orderCount", "operator": "LT", "value": 3 }
    ]
  },
  "action": {
    "type": "REJECT",
    "reasonCode": "R1001"
  }
}

写完之后,一定要在本地跑一遍测试。我常用的方法是准备三组数据:

  • 正向用例:满足所有条件,期望规则命中
  • 反向用例:不满足任一条件,期望规则不命中
  • 边界用例:金额刚好等于 5000、注册天数刚好 30 天

注意:边界用例最容易翻车。我曾经遇到过金额判断用的是「大于等于」,但业务方要的是「大于」。差一个等号,结果完全不同。所以边界测试一定要做。

4.2 规则版本管理:别让「改错了」成为事故

规则不是写一次就完事的。业务在变、数据在变、策略也在变。你今天上线了一条规则,下个月可能就要调整阈值。这时候,版本管理就变得至关重要。

我见过最惨的案例:某团队直接在线上数据库里改规则,改完发现效果不对,想回退却找不到上一版。最后花了三天重新推导逻辑。嗯,这种痛,经历过一次就再也不敢了。

4.2.1 版本号规范

我建议采用 三段式版本号:

版本号 含义 示例
v1.0.0 初始版本 规则第一次上线
v1.1.0 条件调整(阈值、字段变更) 金额阈值从 5000 改为 8000
v1.2.0 动作调整(拒绝码、提示信息变更) 原因码从 R1001 改为 R1002
v2.0.0 重大重构(条件逻辑、触发时机变更) 从 AND 改为 OR 逻辑

版本号要记录在规则的元数据里,不能只靠文件名区分。我习惯在规则配置中加一个 versionHistory 字段:

{
  "ruleId": "RULE_001",
  "currentVersion": "v1.1.0",
  "versionHistory": [
    { "version": "v1.0.0", "deployTime": "2024-01-15 10:00:00", "author": "张三" },
    { "version": "v1.1.0", "deployTime": "2024-02-20 14:30:00", "author": "李四", "changeLog": "金额阈值从5000调整为8000" }
  ]
}

4.2.2 版本回滚策略

规则上线后,如果发现效果异常,要能快速回滚。我推荐两种方式:

  • 全量回滚:将规则整体回退到上一个版本。适合灾难性事故。
  • 增量回滚:只回滚某一条条件的变更。适合局部调整失误。

核心原则:每次上线前,必须保留当前版本的完整备份。不要依赖 Git 的 commit 记录,规则引擎的运行时状态和代码仓库不一定同步。我团队的做法是:每次上线前,自动将当前规则快照存入一个独立的备份表。

4.3 规则生效时间配置:时间错了,规则就废了

生效时间配置看起来简单,但坑最多。我把它分为三种场景:

4.3.1 立即生效

配置上线后立刻开始执行。适合紧急修复或临时策略调整。

{
  "effectiveTime": "IMMEDIATE",
  "expireTime": null
}

但要注意:立即生效不代表「瞬间生效」。规则引擎通常有缓存,配置下发到所有节点需要时间。我建议在配置后等待 1-2 分钟再验证。

4.3.2 定时生效

指定一个未来的时间点开始生效。适合计划性调整,比如大促活动规则。

{
  "effectiveTime": "2024-06-18 00:00:00",
  "expireTime": "2024-06-20 23:59:59"
}

这里有一个容易忽略的点:时区问题。我曾经遇到一个线上事故——规则配置时用了 UTC 时间,但业务方理解的是北京时间。结果规则提前 8 小时生效,导致白天正常订单被拦截。从那以后,我要求所有时间配置必须显式标注时区。

4.3.3 条件触发生效

不依赖时间,而是依赖某个业务状态的变化。比如「当用户等级变为 VIP 时,自动启用 VIP 专属规则」。

{
  "effectiveCondition": {
    "field": "userLevel",
    "operator": "CHANGE_TO",
    "value": "VIP"
  }
}

这种场景在实时风控和营销系统中很常见。配置时要注意:条件触发生效的规则,通常需要配合事件监听器一起使用,否则引擎不会主动去检查状态变化。

避坑指南:我曾经配置过一条「用户首次下单优惠」规则,生效条件设为「用户历史订单数 = 0」。结果上线后发现,所有历史订单数为 0 的用户都触发了优惠,包括那些注册了三年但从未下单的老用户。业务方说「首次」指的是「注册后的第一次」,而不是「历史上从未下单」。你看,同一个条件,理解完全不同。所以生效条件一定要和业务方逐字确认。

4.4 本章小结

规则配置入门,核心就三件事:

  • 创建流程:需求分析 → 条件编写 → 本地测试 → 灰度发布 → 全量上线,缺一不可
  • 版本管理:用三段式版本号,保留完整历史,支持快速回滚
  • 生效时间:分清立即、定时、条件触发三种模式,注意时区和业务语义