3. 实时特征服务架构:整体架构设计、数据流与核心组件
实时特征服务是反欺诈图谱系统的“计算引擎”,它负责将原始行为事件在毫秒级转化为可用于决策的图谱特征。本章从整体架构出发,拆解数据流转路径与核心组件职责,帮助建立从“数据接入”到“在线查询”的完整链路认知。
3.1 整体架构设计
实时特征服务采用分层解耦 + 异步流水线架构,分为接入层、计算层、存储层与查询层。各层通过消息队列与缓存解耦,支持水平扩展与故障隔离。
架构设计原则:
- 低延迟:端到端 P99 延迟 < 50ms,计算层无状态设计。
- 高可用:组件多副本 + 消息队列持久化,单点故障不影响整体。
- 可回溯:特征计算依赖事件时间,支持数据回放与特征回溯。
3.2 数据流:实时接入 → 特征计算 → 特征存储 → 在线查询
数据流是架构的“血液”,每个环节都有明确的输入输出与处理语义。以下按阶段详细拆解。
3.2.1 实时接入
接入层负责接收来自客户端、服务端或第三方的原始事件,如登录、交易、领券等。核心要求是高吞吐、低丢失、顺序保障。
- 协议:支持 HTTP/2、gRPC、Kafka Producer。
- 序列化:Protobuf / Avro,减少带宽与解析开销。
- 去重:基于事件 ID 在接入层做幂等去重。
3.2.2 特征计算
计算层是核心,将原始事件转化为图谱特征。典型计算模式包括:
| 计算模式 | 说明 | 示例 |
|---|---|---|
| 滑动窗口聚合 | 统计过去 N 分钟内事件次数、金额总和 | 5 分钟内同一设备登录次数 |
| 图谱路径计数 | 基于图关系计算关联节点数量 | 同一 IP 关联账户数 |
| 时序特征 | 事件间隔、增速、衰减 | 两次交易间隔 < 1s |
| 图嵌入向量 | 实时更新节点 Embedding | Node2Vec 实时推理 |
计算层避坑:避免在计算层做复杂图遍历(如多跳路径查询),这类操作应下沉到图数据库;实时计算层只做轻量级聚合与预计算。
3.2.3 特征存储
特征存储需要同时满足低延迟写入与高并发读取。不同特征类型选择不同存储引擎:
| 特征类型 | 推荐存储 | 原因 |
|---|---|---|
| 计数器/聚合值 | Redis | 内存操作,微秒级延迟 |
| 历史序列 | HBase / Cassandra | 列式存储,适合时间范围扫描 |
| 图关系特征 | TiKV / Neo4j | 支持分布式事务与图查询 |
| 模型特征 | Redis + 本地缓存 | 热数据本地缓存,冷数据 Redis |
3.2.4 在线查询
查询层对外暴露统一 API,支持批量与单点特征查询。典型查询流程:
- 请求到达查询层,解析实体 ID 与特征名。
- 查询层先查本地缓存(Caffeine),命中则直接返回。
- 未命中则查 Redis / HBase,并回填本地缓存。
- 若特征依赖图关系,则异步调用图数据库接口。
- 聚合结果返回给调用方,整体延迟 < 10ms。
3.3 核心组件
每个架构层由若干核心组件构成,组件之间通过标准接口协作。以下列出关键组件及其职责。
| 组件 | 所属层 | 核心职责 | 选型参考 |
|---|---|---|---|
| Event Collector | 接入层 | 接收事件、校验格式、分配事件 ID、写入消息队列 | 自研 / Nginx + Lua |
| Message Queue | 接入层 | 削峰填谷、持久化、顺序保障 | Kafka / Pulsar |
| Stream Processor | 计算层 | 执行特征计算逻辑,支持窗口、状态、定时器 | Flink / Spark Streaming |
| Feature Store | 存储层 | 存储特征值,支持 TTL、批量读取、原子更新 | Redis / HBase / TiKV |
| Cache Layer | 查询层 | 本地缓存热特征,减少远程调用 | Caffeine / Guava Cache |
| Query Gateway | 查询层 | 统一 API 入口、路由、限流、降级 | 自研 gRPC Gateway |
组件选型注意:不要盲目追求“全链路实时”。对于非核心特征(如 T+1 统计特征),可以走离线批处理链路,避免实时计算资源浪费。实时特征服务只承载高时效性特征。
3.4 架构关键设计点
- 事件时间 vs 处理时间:特征计算必须基于事件时间(Event Time),避免因网络延迟或重试导致特征错乱。Flink 中配置 Watermark 与 allowed lateness。
- 状态后端选择:实时计算任务的状态后端推荐 RocksDB(大状态)或 HashMap(小状态),避免状态膨胀导致 OOM。
- 特征版本管理:特征定义随业务迭代,存储层需支持特征版本号,避免新旧特征冲突。
- 降级与熔断:当存储层或图数据库响应超时,查询层应返回默认值或降级特征,避免阻塞调用方。