策略中台(yidun-mplatform-strategy)
判定链路的「总指挥」:决定一次检测该跑哪些策略集、按什么顺序调 checker、结果怎么融合。
1. 业务定位
解决三个问题:
- 客户在控制台配置的策略,如何在线程内实时、一致、可观测地执行。
- 客户开通新业务/新产品时,如何自动搭建默认策略体系。
- 判定结果如何沉淀为检测记录,供离线验证与历史查询。
三路入口:execution(在线检测方调用)、management(内部运营后台,经 ShenYu 网关)、center(官网 SaaS 客户后台)。
2. 架构与模块划分
| 模块 | 类型 | 职责 |
|---|---|---|
execution/dubbo-provider | app | 在线判定主链路,对外核心 RPC |
management/dubbo-provider | app | 策略/规则/名单/指标/预处理的配置管理编排,策略数据唯一写入方 |
center/dubbo-provider | app | 官网 SaaS 数据聚合、业务事件驱动的策略初始化、命中统计 |
storage | app | 检测记录 Kafka 消费入库(ES/HBase) |
offline | app | 离线验证任务(Elastic-Job) |
execution/contract | jar | 执行契约 v1/v2/v4/v5 四套并行 |
service/base、service/business | jar | DAO 与共享业务 |
history-data | jar | 历史数据查询 API(独立发布) |
分层:协议入口(三个 dubbo-api)→ 编排服务(management + service/business)→ 执行引擎(execution 的 engine/cache/remote)→ 存储(storage + service/base)。
3. 核心链路
编排要点:
- 通用集与私有集并发,单个策略集独立超时,超时只降级该集。
- checker 通过 Dubbo 远程调用,顺序由策略过程配置决定。
- 结果融合时,正式命中与试运行命中分离,处置只取正式命中。
- 检测记录投递 Kafka 后由
storage落 ES/HBase,不阻塞回包。
4. 关键数据模型
| 对象 | 关键字段 | 说明 |
|---|---|---|
策略集 StrategySetDo | mode(NORMAL=1 常规 / POST=2 后置)、isPrivate | 决定执行阶段与是否客户私有 |
执行上下文 Context | input、prepro、output、summary | v1/v2/v4/v5 多版本并存 |
规则集结果 StrategySetResult | 命中规则、试命中规则、失败规则 | 融合的最小单位 |
| 检测记录 | 输入、判定结果、耗时 | Kafka → ES/HBase |
多版本契约是最大坑点:execution/contract 下 v1/v2/v4/v5 四套结构并行,改动必须保证 ContextConverter 转换正确。
5. 存储与中间件
| 组件 | 用途 |
|---|---|
| MySQL + MyBatis | 策略、规则、策略集配置 |
| Redis | 策略元数据缓存、分布式锁 |
| Elasticsearch | 检测记录检索 |
| HBase | 检测记录明细(大字段) |
| Kafka | 检测记录、命中统计、业务事件消费 |
| Apollo | 各应用独立命名空间配置 |
| Elastic-Job | 离线验证、命中统计、缓存刷新 |
6. 设计模式与扩展点
| 扩展点 | 位置 | 说明 |
|---|---|---|
| YAML 流水线 | center/pipeline | 用 condition + actionType(如 create_strategy_if_not_exist、online_rule)声明「业务开通时自动建什么」,不改 Java 即可扩展 |
| 策略集名称处理器 | BusinessPrivateStrategySetNameHandler | 私有策略集命名规约 |
| 验证任务 | offline | 离线回放历史数据验证规则效果 |
| 结果融合 | StrategySetProcess | 多策略集结果合并策略 |
7. 上下游依赖
| 方向 | 模块 | 说明 |
|---|---|---|
| 上游 | intelligent-risk、device-fingerpint | 在线检测调用执行服务 |
| 上游 | api-gateway | 管理后台请求路由 |
| 上游 | mplatform-business | 订阅业务/产品/套餐事件,触发策略初始化 |
| 下游 | checker-preprocess / checker-namelist / checker-metrics / checker-rule | 四类判定能力 |
| 下游 | mplatform-meta | 字段、风险标签定义 |
| 下游 | mplatform-clickhouse | 命中统计数据源 |
| 下游 | union-admin | 权限与操作日志 |
8. 工程约束与变更红线
execution是判定主链路,任何改动必须评估对线上拦截率的影响,先在预上线验证。- 契约多版本不可混用:v1/v2/v4/v5 结构变更需同时改转换器,否则调用方反序列化失败。
- 策略数据只能由
management写入,其他应用禁止直写策略表。 - 超时必须可降级:新增 checker 调用必须设置独立超时与降级分支。
- 检测记录不允许阻塞主链路,写入异常只记日志。
9. 关键代码索引
| 主题 | 路径 | 说明 |
|---|---|---|
| 在线判定入口 | yidun-mplatform-strategy/execution/dubbo-provider/src/main/java/.../OnlineCheckService.java | 判定编排起点 |
| 任务拆分 | yidun-mplatform-strategy/execution/dubbo-provider/src/main/java/.../TaskCreatorV5.java | 通用/私有集拆分 |
| 任务执行 | yidun-mplatform-strategy/execution/dubbo-provider/src/main/java/.../TaskExecutorV5.java | 并发执行与超时 |
| 策略元数据缓存 | yidun-mplatform-strategy/execution/dubbo-provider/src/main/java/.../OnlineCheckStrategyMetaCache.java | 策略集配置缓存 |
| 策略管理 | yidun-mplatform-strategy/management/dubbo-provider/src/main/java/.../StrategyManagementProvider.java | 策略/策略集 CRUD |
| 规则管理编排 | yidun-mplatform-strategy/management/dubbo-provider/src/main/java/.../RuleInfoServiceImpl.java | 规则状态机与上线准则 |
| 业务事件流水线 | yidun-mplatform-strategy/center/dubbo-provider/src/main/java/.../EventTriggeredPipelineExecutor.java | 自动初始化策略 |
| 检测记录入库 | yidun-mplatform-strategy/storage/src/main/java/.../CheckRecordConsumer.java | Kafka 消费落库 |
10. 排查要点
| 现象 | 定位 | 结论 |
|---|---|---|
| 某业务完全不判定 | 看策略集元数据缓存是否有该业务 | 策略未绑定或业务未开通,execution 直接返回空结果 |
| 只有部分规则生效 | 看规则状态与所属规则集 | 预上线规则只产生试命中 |
| 判定耗时突增 | 看各策略集执行耗时 | 单个 checker 慢或未超时降级 |
| 新业务没有默认策略 | 看业务事件是否被消费 | center 未收到事件或流水线条件不匹配 |
| 检测记录缺失 | 看 Kafka 投递与 storage 消费 | 与判定结果是否正确无关 |