2. 归因特征服务架构设计:整体架构分层与核心组件
归因特征服务作为归因分析系统的核心数据供给层,其架构设计直接决定了特征计算的时效性、稳定性和可扩展性。本章将详细阐述归因特征服务的整体架构分层、核心组件、数据流与依赖关系,帮助读者建立从数据接入到特征输出的完整架构视图。
2.1 整体架构分层
归因特征服务采用经典的三层架构设计:接入层、计算层和存储层。每一层职责清晰,通过标准接口进行通信,便于独立扩展和运维。
| 架构层 | 核心职责 | 关键组件 | 稳定性关注点 |
|---|---|---|---|
| 接入层 | 统一入口、协议转换、请求路由、限流熔断 | API Gateway、负载均衡器、请求校验模块 | 高并发下的限流策略、超时控制、降级开关 |
| 计算层 | 特征逻辑编排、归因规则执行、实时/离线计算 | 特征计算引擎、规则引擎、任务调度器 | 计算资源隔离、任务超时重试、数据一致性 |
| 存储层 | 特征数据持久化、缓存加速、元数据管理 | 在线 KV 存储、离线数仓、缓存集群、元数据库 | 缓存穿透/雪崩、数据冷热分层、备份恢复 |
架构设计原则:每一层都具备独立的水平扩展能力,层与层之间通过异步消息队列或 RPC 接口解耦,避免单点故障扩散。
2.2 核心组件介绍
2.2.1 接入层组件
- API Gateway:统一对外暴露 HTTP/HTTPS 接口,负责请求鉴权、参数校验、协议转换(如 ProtoBuf 转 JSON)。
- 限流熔断器:基于令牌桶或滑动窗口算法,对突发流量进行削峰;当下游计算层响应超时或错误率超过阈值时,自动熔断并返回降级特征。
- 请求路由:根据特征 ID 或业务线标识,将请求分发到对应的计算节点,支持灰度发布和流量染色。
2.2.2 计算层组件
- 特征计算引擎:核心计算单元,负责执行特征逻辑(如用户最近 7 天点击次数、归因窗口期内的转化率)。支持 Groovy/Java 动态脚本热加载。
- 规则引擎:管理归因规则(如首次点击归因、末次点击归因、线性归因),支持规则版本管理和在线切换。
- 任务调度器:管理离线批量特征计算任务,支持依赖编排、失败重试、任务优先级调度。
2.2.3 存储层组件
- 在线 KV 存储:使用 Redis 或自研 KV 引擎,存储高频访问的实时特征,TTL 策略按特征冷热程度差异化设置。
- 离线数仓:基于 Hive/Iceberg 存储全量历史特征数据,用于回溯分析和模型训练。
- 元数据库:记录特征定义、版本、依赖关系、数据源映射等元信息,是特征治理的基础。
2.3 数据流与依赖关系
归因特征服务的数据流分为实时链路和离线链路两条主线,两条链路在存储层汇聚,共同支撑特征服务。
2.3.1 实时数据流
- 事件采集:客户端/服务端上报行为事件(如曝光、点击、转化)到消息队列(Kafka)。
- 实时消费:计算层实时消费事件流,通过 Flink/Spark Streaming 进行窗口聚合,生成实时特征。
- 特征写入:实时特征写入在线 KV 存储,同时异步写入离线数仓。
- 在线查询:接入层收到特征查询请求后,从在线 KV 存储读取特征并返回。
2.3.2 离线数据流
- 数据同步:离线数仓从 Kafka 或业务 DB 同步全量事件数据。
- 批量计算:任务调度器触发离线特征计算任务(如 T-1 全量特征回溯),计算结果写入离线数仓。
- 特征导出:离线特征定期导出到在线 KV 存储,用于补充实时特征未覆盖的场景。
依赖关系管理:特征服务对外依赖包括消息队列(Kafka)、在线 KV 存储(Redis)、离线数仓(Hive)和元数据库。建议为每个依赖配置独立的连接池和超时阈值,避免单一依赖故障影响全局。
2.4 架构总览图
下图展示了归因特征服务的整体架构分层、核心组件以及实时/离线数据流走向。
2.5 依赖关系矩阵
特征服务对外部组件的依赖关系直接影响稳定性巡检策略的制定。下表列出了核心依赖及其关键指标:
| 依赖组件 | 依赖类型 | 关键指标 | 故障影响 |
|---|---|---|---|
| Kafka | 强依赖 | 消息堆积量、消费延迟 | 实时特征更新停滞 |
| Redis | 强依赖 | 缓存命中率、连接数、内存使用率 | 在线查询超时或降级 |
| Hive/Iceberg | 弱依赖(离线) | 任务完成率、数据产出延迟 | 离线特征缺失,不影响在线 |
| 元数据库 | 强依赖(管理面) | 读写延迟、连接池状态 | 特征发布/变更失败 |
稳定性巡检重点:实时链路中 Kafka 消费延迟和 Redis 缓存命中率是最高优先级的巡检指标。建议设置多级告警阈值(Warning / Critical),并配置自动降级策略(如缓存穿透时返回默认特征)。
2.6 架构设计要点总结
- 分层解耦:接入层、计算层、存储层职责分离,每层可独立扩缩容,避免单层故障扩散。
- 实时/离线双链路:实时链路保障低延迟特征查询,离线链路提供全量历史特征,两条链路在存储层汇聚。
- 依赖治理:明确强弱依赖关系,为强依赖组件配置熔断降级和限流策略,为弱依赖组件设置异步补偿机制。
- 可观测性:每层组件暴露核心指标(延迟、吞吐、错误率),支持链路追踪和日志聚合,便于快速定位故障。