4、特征Serving核心概念:在线Serving与离线Serving、低延迟要求、高并发设计
特征Serving(Feature Serving)是特征平台连接特征生产与模型推理的关键桥梁。本章聚焦Serving阶段的核心概念,帮助架构师理解在线与离线Serving的本质差异、低延迟的技术约束以及高并发下的设计策略。
4.1 在线Serving与离线Serving
特征Serving根据使用场景可分为在线Serving和离线Serving两种模式。两者在延迟要求、数据源、计算方式和存储选型上存在显著差异。
| 对比维度 | 在线Serving | 离线Serving |
|---|---|---|
| 使用场景 | 实时推理、在线推荐、风控拦截 | 批量打分、离线训练、数据回刷 |
| 延迟要求 | 毫秒级(P99 < 50ms) | 分钟~小时级 |
| 数据源 | 实时流(Kafka/Flink)+ 在线存储 | 离线数仓(Hive/Spark) |
| 计算模式 | 点查 + 轻量聚合 | 批量扫描 + 大规模Join |
| 存储选型 | Redis / Memorystore / 本地缓存 | HDFS / 对象存储 / 列式存储 |
| 典型框架 | Feast Online Store / TFServing | Spark / Flink Batch / Hive |
架构要点:在线Serving必须保证特征数据的实时一致性,即特征值在写入后能立即被推理请求读取;离线Serving则更关注数据完整性和回溯能力,允许一定的数据延迟。
4.2 低延迟要求
在线Serving的核心挑战是低延迟。模型推理的端到端延迟通常要求P99在50ms以内,其中特征获取环节的耗时必须控制在10ms以内。低延迟设计需要从存储、计算和网络三个层面进行优化。
- 存储层:使用内存级存储(Redis / Memcached),避免磁盘I/O;特征数据按
实体ID + 特征名称的扁平Key结构存储,减少查询路径。 - 计算层:预计算聚合特征,避免在线实时聚合;使用特征预取(Feature Prefetch)机制,在模型推理前批量获取所需特征。
- 网络层:特征Serving服务与模型推理服务尽量同机部署或同机房部署,减少网络跳转;使用gRPC协议替代HTTP/1.1,降低序列化开销。
实践建议:对于高频特征,使用本地缓存(如Caffeine / Guava Cache)作为L1缓存,Redis作为L2缓存,可进一步降低P99延迟至5ms以内。
4.3 高并发设计
在线Serving需要应对高并发场景,例如推荐系统在流量高峰时每秒处理数万次请求。高并发设计需要从架构层面解决资源竞争、连接管理和弹性扩缩容问题。
4.3.1 连接池与复用
特征Serving服务与下游存储(如Redis)之间使用连接池管理TCP连接,避免每次请求都新建连接。连接池大小需根据QPS和平均响应时间动态调整。
// 连接池配置示例(Java)
RedisPoolConfig config = new RedisPoolConfig();
config.setMaxTotal(200); // 最大连接数
config.setMaxIdle(50); // 最大空闲连接
config.setMinIdle(10); // 最小空闲连接
config.setMaxWaitMillis(100); // 获取连接最大等待时间(ms)
config.setTestOnBorrow(true); // 借用时检测连接有效性
4.3.2 无状态水平扩展
特征Serving服务设计为无状态,所有实例对等,通过负载均衡器(如Nginx / Envoy)分发请求。水平扩展时只需增加实例数量,无需迁移数据。
4.3.3 缓存策略
- 本地缓存:每个实例维护独立缓存,减少对远程存储的并发压力。
- 分布式缓存:使用Redis Cluster或Memcached,通过一致性哈希分散热点Key。
- 缓存淘汰:采用LRU或TTL策略,防止缓存膨胀导致内存溢出。
避坑提示:高并发场景下,缓存穿透(请求大量不存在的Key)会导致存储层压力骤增。建议使用布隆过滤器(Bloom Filter)或空值缓存来防御。
4.4 在线与离线Serving的协同
在实际特征平台中,在线Serving和离线Serving并非孤立存在,而是通过特征存储和特征元数据实现协同。离线Serving产出的批量特征数据会定期同步到在线存储,供实时推理使用;在线Serving产生的实时特征也会回流到离线数仓,用于模型训练和回刷。
| 协同环节 | 离线→在线 | 在线→离线 |
|---|---|---|
| 数据流向 | 批量特征写入在线存储 | 实时特征写入离线数仓 |
| 同步频率 | 小时级 / 天级 | 分钟级 / 流式写入 |
| 一致性保证 | 最终一致性 | 至少一次语义 |
| 典型工具 | Dataflow / Airflow + 批量导入 | Kafka Connect / Flink CDC |
架构原则:在线Serving和离线Serving共享同一套特征定义和特征版本,确保训练和推理时使用的特征逻辑一致,避免训练/推理偏差(Training-Serving Skew)。