3. 实时特征服务架构:整体架构设计、数据流与核心组件

实时特征服务是反欺诈图谱系统的“计算引擎”,它负责将原始行为事件在毫秒级转化为可用于决策的图谱特征。本章从整体架构出发,拆解数据流转路径与核心组件职责,帮助建立从“数据接入”到“在线查询”的完整链路认知。

3.1 整体架构设计

实时特征服务采用分层解耦 + 异步流水线架构,分为接入层、计算层、存储层与查询层。各层通过消息队列与缓存解耦,支持水平扩展与故障隔离。

架构设计原则:
  • 低延迟:端到端 P99 延迟 < 50ms,计算层无状态设计。
  • 高可用:组件多副本 + 消息队列持久化,单点故障不影响整体。
  • 可回溯:特征计算依赖事件时间,支持数据回放与特征回溯。
实时特征服务整体架构分层图 实时特征服务整体架构分层图 接入层 Kafka / HTTP API / SDK 接入 计算层 Flink / Spark Streaming 实时特征计算 存储层 Redis / HBase / TiKV 特征存储 查询层 gRPC / HTTP 在线特征查询 API

3.2 数据流:实时接入 → 特征计算 → 特征存储 → 在线查询

数据流是架构的“血液”,每个环节都有明确的输入输出与处理语义。以下按阶段详细拆解。

3.2.1 实时接入

接入层负责接收来自客户端、服务端或第三方的原始事件,如登录、交易、领券等。核心要求是高吞吐、低丢失、顺序保障。

  • 协议:支持 HTTP/2、gRPC、Kafka Producer。
  • 序列化:Protobuf / Avro,减少带宽与解析开销。
  • 去重:基于事件 ID 在接入层做幂等去重。

3.2.2 特征计算

计算层是核心,将原始事件转化为图谱特征。典型计算模式包括:

计算模式说明示例
滑动窗口聚合统计过去 N 分钟内事件次数、金额总和5 分钟内同一设备登录次数
图谱路径计数基于图关系计算关联节点数量同一 IP 关联账户数
时序特征事件间隔、增速、衰减两次交易间隔 < 1s
图嵌入向量实时更新节点 EmbeddingNode2Vec 实时推理
计算层避坑:避免在计算层做复杂图遍历(如多跳路径查询),这类操作应下沉到图数据库;实时计算层只做轻量级聚合与预计算。

3.2.3 特征存储

特征存储需要同时满足低延迟写入与高并发读取。不同特征类型选择不同存储引擎:

特征类型推荐存储原因
计数器/聚合值Redis内存操作,微秒级延迟
历史序列HBase / Cassandra列式存储,适合时间范围扫描
图关系特征TiKV / Neo4j支持分布式事务与图查询
模型特征Redis + 本地缓存热数据本地缓存,冷数据 Redis

3.2.4 在线查询

查询层对外暴露统一 API,支持批量与单点特征查询。典型查询流程:

  1. 请求到达查询层,解析实体 ID 与特征名。
  2. 查询层先查本地缓存(Caffeine),命中则直接返回。
  3. 未命中则查 Redis / HBase,并回填本地缓存。
  4. 若特征依赖图关系,则异步调用图数据库接口。
  5. 聚合结果返回给调用方,整体延迟 < 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。
  • 特征版本管理:特征定义随业务迭代,存储层需支持特征版本号,避免新旧特征冲突。
  • 降级与熔断:当存储层或图数据库响应超时,查询层应返回默认值或降级特征,避免阻塞调用方。