2. 特征服务架构详解:特征存储、特征计算、特征获取的典型架构(在线/离线)
特征服务是风控系统的“数据心脏”,其架构设计直接决定了特征的生产效率、在线获取的延迟以及离在线一致性。本章从存储、计算、获取三个维度拆解典型架构,并对比在线与离线场景下的核心差异。
2.1 特征存储:分层与选型
特征存储需要同时支撑高吞吐的离线批处理与低延迟的在线实时查询。业界普遍采用“冷热分层”策略,不同层使用不同的存储引擎。
| 存储层 | 典型引擎 | 数据时效 | 查询延迟 | 主要用途 |
|---|---|---|---|---|
| 离线存储 | HDFS / Hive / MaxCompute | T+1 / 小时级 | 分钟级 | 历史回溯、训练样本生成、批量特征计算 |
| 近线存储 | HBase / Cassandra | 分钟级 | 毫秒级 | 滑动窗口特征、实时聚合中间结果 |
| 在线存储 | Redis / Aerospike / 自研KV | 实时 | 微秒~毫秒级 | 风控实时决策、模型在线推理 |
架构要点:在线存储必须支持高并发随机读取(通常 QPS > 10万),且具备主从复制与持久化能力,防止节点宕机导致特征丢失。
2.2 特征计算:离线批处理与在线流计算
特征计算分为离线与在线两条链路,两者在计算引擎、窗口定义、数据源上存在本质区别。
- 离线计算(Batch):使用 Spark / Hive 按天或小时调度,处理全量历史数据。适用于复杂聚合(如 30 天滑动平均)、跨表 Join、衍生特征生成。产出物直接写入离线存储,并同步一份到在线 KV 存储。
- 在线计算(Streaming):使用 Flink / Spark Streaming 处理实时事件流。适用于秒级滑动窗口(如 5 分钟内交易次数)、状态计算、规则触发。计算结果实时写入在线存储,同时落盘到离线存储用于回放校验。
离在线一致性关键:离线与在线必须使用同一份特征计算逻辑代码(通常封装为 UDF 或特征函数库),避免因实现差异导致离线回放与在线结果不一致。
2.3 特征获取:在线服务调用链路
在线特征获取是风控网关的核心环节,延迟通常要求 < 5ms。典型获取流程如下:
- 请求入站:风控网关收到实时事件(如交易、登录),提取实体 ID(用户、设备、订单)。
- 特征路由:根据特征配置中心的路由规则,确定每个特征所在的存储节点或计算单元。
- 并行拉取:通过多线程或协程并发从在线 KV 存储、近线存储、实时计算引擎中拉取特征值。
- 特征组装:将拉取到的原始特征与实时计算特征合并,组装成完整的特征向量。
- 返回决策:特征向量传递给模型引擎或规则引擎,输出风控决策结果。
2.4 离在线一致性保障:双链路校验
离在线不一致是特征服务最常见的故障。保障一致性的核心手段是“双链路校验”:
- 离线回放链路:将在线实时日志按时间窗口回放到离线计算引擎,使用与在线相同的特征逻辑重新计算,产出“离线特征快照”。
- 在线实时链路:在风控网关侧对同一批事件实时计算特征,并落盘“在线特征快照”。
- 比对任务:定时任务将离线快照与在线快照按实体 ID + 时间戳对齐,逐特征比对值是否一致。
常见陷阱:时间窗口边界处理不一致(如离线使用自然天,在线使用滑动 24 小时)、空值默认值不同、精度截断差异,都会导致比对失败。建议在特征定义阶段就统一窗口语义与空值策略。
2.5 典型架构总览:在线/离线一体化
下图展示了一个完整的在线/离线一体化特征服务架构,涵盖从数据源到最终决策的全链路:
2.6 架构选型建议
| 场景 | 推荐存储 | 推荐计算引擎 | 关键指标 |
|---|---|---|---|
| 高并发实时风控(QPS > 5万) | Redis Cluster + 本地缓存 | Flink + 状态后端 RocksDB | P99 延迟 < 3ms |
| 复杂衍生特征(30+ 维滑动窗口) | HBase + Redis 二级缓存 | Spark Streaming + 批处理回补 | 离在线一致性 > 99.99% |
| 多租户特征隔离 | 自研 KV 存储(按租户分桶) | Kubernetes 独立计算 Pod | 租户间资源隔离 < 5% 抖动 |
实战经验:在风控网关回放对比中,80% 的特征不一致问题源于离线与在线使用了不同的特征版本。建议在特征配置中心中统一管理版本号,并在每次特征上线时强制进行离在线比对测试。