3. 特征服务概念详解
特征服务是推荐系统与风控系统的核心数据基础设施。它负责将原始数据转化为可供模型推理使用的特征向量,并管理特征从生产到消费的完整生命周期。理解特征服务的内部机制,是进行有效压力测试的前提。
3.1 什么是特征服务
特征服务是一个在线数据转换与分发层,它屏蔽了底层异构数据源(实时流、离线数仓、在线数据库)的复杂性,对外提供统一、低延迟、高并发的特征查询接口。在微服务架构中,特征服务通常作为独立的中间件存在。
核心职责: 将“数据”转化为“特征”,并保证特征的时效性、一致性与可用性。
| 维度 | 传统数据查询 | 特征服务 |
|---|---|---|
| 返回内容 | 原始数据行(如用户点击日志) | 加工后的特征向量(如用户近7天点击率) |
| 延迟要求 | 秒级到分钟级 | 毫秒级(通常 < 20ms) |
| 计算模式 | 即席查询(Ad-hoc) | 预计算 + 在线组装 |
| 数据源 | 单一数据库 | 多源异构(Kafka、HBase、Redis) |
3.2 特征服务的生命周期
特征的生命周期包含三个核心阶段:提取、存储与在线计算。这三个阶段共同决定了特征服务的性能瓶颈与压力模型。
3.2.1 特征提取(Feature Extraction)
从原始数据中识别并计算特征值的过程。提取方式分为离线批处理与实时流处理:
- 离线提取: 使用 Spark/Flink 对历史日志进行批量聚合,生成用户画像、物品统计特征。适用于变化缓慢的长期特征。
- 实时提取: 消费 Kafka 中的实时事件流,通过滑动窗口计算瞬时行为特征(如“最近5秒点击次数”)。适用于对时效性敏感的短期特征。
3.2.2 特征存储(Feature Storage)
将提取后的特征持久化到高性能存储引擎中,供在线服务读取。常见的存储选型如下:
| 存储类型 | 典型组件 | 适用场景 | 压力特征 |
|---|---|---|---|
| 键值存储 | Redis / Aerospike | 用户实时特征、Embedding 向量 | 高 QPS、低延迟、大 Value |
| 宽表存储 | HBase / Cassandra | 用户画像、物品属性 | 高吞吐、稀疏列、范围查询 |
| 内存缓存 | 本地 Guava Cache / Caffeine | 热点特征、模型权重 | 纳秒级访问、容量受限 |
3.2.3 在线计算(Online Computation)
在推理请求到达时,实时组装并计算最终特征向量的过程。这是压力测试中最关键的环节,因为它直接暴露在请求路径上。
压测关注点: 在线计算阶段通常涉及“特征穿越”(跨特征组 Join)和“特征变换”(如归一化、离散化),这些操作是 CPU 密集型,容易成为瓶颈。
// 在线特征计算伪代码示例
public FeatureVector compute(Request request) {
// 1. 获取基础特征(从缓存或 DB)
UserProfile user = featureStore.getUserProfile(request.getUserId());
ItemProfile item = featureStore.getItemProfile(request.getItemId());
// 2. 实时聚合特征(滑动窗口)
double clickRate = realtimeCounter.getClickRate(request.getUserId(), 300); // 近5分钟
// 3. 特征交叉与变换
double crossFeature = user.getAgeGroup() * item.getCategoryId();
double normalized = (clickRate - mean) / std;
// 4. 组装最终向量
return new FeatureVector(user.getEmbedding(), item.getEmbedding(), normalized);
}
3.3 特征服务在推荐/风控系统中的作用
特征服务是连接数据层与模型推理层的桥梁。在推荐与风控系统中,它的作用可以概括为以下三点:
- 统一特征视图: 消除不同业务线之间的特征孤岛,确保推荐模型和风控模型看到的是同一份特征数据,避免线上线下不一致。
- 降低推理延迟: 通过预计算、缓存、并行查询等手段,将特征获取延迟压缩到毫秒级,使模型能够在 SLA 内完成推理。
- 支撑复杂特征逻辑: 支持时间衰减、序列特征、图特征等复杂计算逻辑,而这些逻辑在原始数据库 SQL 中难以高效实现。
压测陷阱: 在压力测试中,特征服务往往是第一个崩溃的环节。因为模型推理的算力可以水平扩展,但特征存储(如 Redis 集群)的带宽和连接数存在物理上限。必须针对特征服务单独设计压测场景。
3.4 特征服务架构示意
下图展示了特征服务在推荐系统中的典型架构位置及其内部组件关系:
3.5 特征服务在推荐与风控中的差异
虽然架构相似,但推荐系统和风控系统对特征服务的要求存在显著差异,这些差异直接影响压力测试的模型设计:
| 对比维度 | 推荐系统 | 风控系统 |
|---|---|---|
| 特征数量 | 数百到数千个特征 | 数十到数百个特征 |
| 延迟要求 | 50ms 以内(用户体验敏感) | 200ms 以内(可接受稍高延迟) |
| 特征时效性 | 分钟级(用户兴趣变化) | 秒级(欺诈行为实时检测) |
| 计算复杂度 | 高(大量交叉特征、Embedding) | 中(规则匹配 + 简单聚合) |
| 压测关注点 | 缓存命中率、特征穿越性能 | 实时窗口计算、冷启动特征 |
总结: 特征服务是压力测试中不可跳过的关键组件。它的生命周期(提取→存储→在线计算)决定了压测场景必须覆盖数据写入、缓存预热、并发查询和复杂计算四种负载模式。只有深入理解特征服务的内部结构,才能设计出有效的压力测试方案。