[控场AI]
· 14 分钟阅读· 7,293 字

Lakebase能否胜任ML实时特征服务?延迟与并发深度分析

Lakebase能否胜任ML实时特征服务?延迟与并发深度分析

引言:数据湖仓与ML服务层的融合

随着机器学习工程逐渐从批处理走向实时推理,数据基础设施的选型变得越来越关键。近期在 Reddit 社区中,一位开发者提出了一个颇具代表性的问题:Lakebase 能否胜任 ML 应用的服务型数据库(serving DB)角色? 尤其是在实时特征查询(real-time feature lookup)和推理工作负载场景下,它在延迟和并发方面的表现究竟如何?

这个问题触及了当前 MLOps 领域一个核心痛点:如何在统一的数据平台上,同时满足分析型(OLAP)和事务型(OLTP)的双重需求。OLAP 侧重于对大规模数据进行聚合分析,典型操作包括多表关联和分组统计,查询延迟在秒级到分钟级;OLTP 则服务于在线事务场景,以高频率的单行读写为主,要求毫秒级响应和强一致性。长期以来,业界普遍认为这两种负载难以在同一系统中高效共存,因此催生了 ETL 管道将数据从事务系统搬运到分析系统的经典架构模式。近年来 HTAP(混合事务分析处理)概念兴起,TiDB、CockroachDB 等新型数据库尝试在一个系统中同时支持两类负载,Lakebase 可以被视为 Databricks 在这一方向上的重要探索。

reddit source: Lakebase for ML workloads

什么是 Lakebase:Databricks 湖仓架构的事务型扩展

概念定位

Lakebase 是 Databricks 生态中提出的一种新型数据库形态,其核心理念是将 Postgres 兼容的事务型数据库能力直接构建在数据湖仓(Lakehouse)架构之上。它试图弥合传统数据湖"擅长分析、不擅长低延迟点查"的短板。

要理解 Lakebase 的定位,需要先了解数据湖仓这一架构范式。数据湖仓融合了数据湖(Data Lake)的灵活性和数据仓库(Data Warehouse)的结构化查询能力。传统数据湖基于对象存储(如 S3、ADLS)保存原始数据,成本低廉但缺乏事务支持和模式管理;数据仓库则提供强一致性和高性能查询,但存储成本高且扩展性受限。湖仓架构通过在对象存储之上引入 Delta Lake、Apache Iceberg 等开放表格式(Open Table Format),实现了 ACID 事务、时间旅行(Time Travel)、模式演进等企业级特性,同时保留了数据湖的低成本与开放性。

在开放表格式的具体实现上,Delta Lake 由 Databricks 开源,其核心是一个事务日志(Transaction Log),记录对数据文件的每一次变更操作。通过这个日志,Delta Lake 在 Parquet 文件之上实现了 ACID 事务、并发控制和时间旅行能力。Apache Iceberg 由 Netflix 发起,采用了类似但不同的元数据层设计,通过快照树(Snapshot Tree)管理表状态。Apache Hudi 则由 Uber 开源,最初聚焦于增量数据处理(Incremental Processing)。这三者形成了当前开放表格式的三足鼎立格局,各有侧重但都致力于让数据湖具备仓库级的数据管理能力。然而,这种架构的设计初衷主要面向分析型工作负载,对低延迟点查场景的支持一直是待突破的短板——这正是 Lakebase 试图解决的问题。

简单来说,传统架构中团队往往需要维护两套系统:一套是承载分析负载的数据仓库/湖仓,另一套是提供在线服务的 OLTP 数据库(如 Postgres、Redis 等)。数据需要在两者之间来回同步,这既增加了运维复杂度,也引入了数据一致性风险。Lakebase 的目标正是通过"存算分离 + Postgres 引擎"的组合,让同一份数据既能被分析引擎读取,也能被在线应用低延迟访问。

值得注意的是,Lakebase 选择 Postgres 兼容并非偶然,这反映了数据库行业的一个重要趋势。PostgreSQL 的线协议(Wire Protocol)已成为事实上的行业标准接口,类似于 MySQL 协议在另一个生态中的地位。CockroachDB、YugabyteDB、Amazon Aurora PostgreSQL、Neon、AlloyDB 等新兴数据库均选择兼容 Postgres 协议,这意味着现有的 Postgres 客户端库、ORM 框架、监控工具可以无缝迁移。对于 ML 团队而言,这降低了采用门槛——Python 生态中的 psycopg2、SQLAlchemy 等成熟库可以直接使用,无需学习新的 SDK 或适配新的数据访问模式。

为什么 ML 实时推理场景特别关注 Lakebase

对于 ML 推理服务而言,最典型的需求是特征查询:当一个推理请求到来时,模型需要实时从数据库中拉取该用户或实体对应的特征向量。在 MLOps 工具链中,这一能力通常由特征存储(Feature Store)提供。Feast、Tecton、Hopsworks 等开源或商业特征存储通过提供统一的特征定义,以及离线(批量)存储和在线(低延迟)存储的双层架构来管理特征生命周期。在线存储通常使用 Redis、DynamoDB 等键值数据库,提供亚毫秒级的点查性能;离线存储则基于数据湖或数据仓库,用于批量特征回填和训练数据集构建。

在这一双层架构中,在线存储和离线存储之间通常通过一个称为"物化"(Materialization)的过程连接:离线存储中通过批处理或流处理管道计算好的特征值,被定期或实时同步到在线存储中。这个物化过程本身就是一个复杂的工程问题——需要处理数据倾斜、保证幂等性、管理特征版本。Feast 的物化作业(Materialization Job)就是专门处理这一环节的组件。Lakebase 如果能在架构层面消除这个物化步骤,让同一套存储同时服务于在线查询和离线分析,将显著简化特征工程管道。但能否在在线层达到专用键值存储的性能水平,仍是关键疑问。

这类特征查询操作具有以下特点:

  • 点查为主:通常是基于主键的单行或少量行查询
  • 高并发:线上服务的 QPS 可能达到数千甚至更高
  • 低延迟敏感:特征查询往往处于推理链路的关键路径上,几毫秒的延迟都可能影响整体 SLA

这里所说的 SLA(服务等级协议),在在线服务中通常以百分位延迟作为关键指标,例如"P99 延迟不超过 50ms"。P99 延迟指的是 99% 的请求都能在该阈值内完成响应——相比平均延迟,P99 更能反映真实的用户体验,因为在微服务架构中,一次用户请求可能串联调用多个服务,每个服务的长尾延迟都会被放大。Google 工程师 Jeff Dean 在其经典演讲《The Tail at Scale》中详细分析了这一现象:假设一次用户请求需要并行调用 100 个后端服务,即使每个服务的 P99 延迟只有 10ms,整体请求在 10ms 内完成的概率仅为 0.99^100 ≈ 36.6%。这意味着超过 63% 的用户请求会因为至少一个服务的长尾延迟而变慢。应对策略包括对冲请求(Hedged Requests)、请求分级(Request Classification)和容忍降级(Graceful Degradation)等。即便模型推理本身很快,一个延迟不稳定的特征服务也可能导致整体 SLA 频繁违约。

这正是原帖作者关心的核心:Lakebase 在这三个维度上,能否媲美一个专门调优过的 Postgres 或专用特征存储(Feature Store)?

实时特征查询的核心挑战

延迟:存算分离架构决定下限

Lakebase 建立在存算分离的湖仓架构之上,这在带来弹性扩展和成本优势的同时,也可能引入额外的延迟开销。存算分离(Disaggregated Storage and Compute)是云原生数据库架构的核心设计理念之一,它将传统数据库中紧耦合的存储层和计算层拆分为独立组件:存储层通常依托对象存储(如 AWS S3)或分布式文件系统,计算层则是无状态的查询引擎节点。这种架构的优势在于存储和计算可以独立扩展——存储几乎无限且按用量付费,计算资源可以按需弹性伸缩甚至缩容到零。Snowflake、BigQuery、Redshift Serverless 等主流云数据仓库均采用此架构。然而,存算分离的代价是数据访问需要跨越网络边界,即便在同一可用区内,网络往返延迟也比本地 NVMe SSD 高出一到两个数量级。

相比本地磁盘或内存缓存的传统 Postgres,跨越对象存储层的数据访问在冷读场景下往往更慢。对于 ML 特征服务来说,关键在于热数据的缓存策略。存算分离架构下的缓存设计通常采用多层结构:最靠近计算层的是进程内缓存(如基于 LRU 算法的内存缓存),其次是本地 NVMe SSD 缓存,再往下是分布式缓存层(如 Redis 集群或专用缓存服务),最底层才是远端对象存储。每一层在容量、延迟和成本上形成梯度——进程内缓存延迟在微秒级但容量有限(GB 级),本地 SSD 延迟在百微秒级但容量可达 TB 级,对象存储延迟在数十毫秒级但容量近乎无限。Snowflake 的本地 SSD 缓存、Databricks 的 Delta Cache 都是这一思路的具体实现。

如果 Lakebase 具备完善的内存/SSD 缓存层,能够将高频访问的特征保留在低延迟介质中,那么其 P99 延迟有可能控制在可接受范围。但缓存的有效性高度取决于工作负载的局部性——如果特征查询集中在热门用户或实体上,缓存命中率会很高;但在推荐系统等长尾分布场景中,冷门实体的查询可能频繁穿透缓存层直达对象存储,导致延迟飙升。如果缓存命中率不佳,冷启动或长尾查询的延迟波动就可能成为线上隐患。

并发:连接管理与自动扩缩容

PostgreSQL 采用的是"每连接一进程"(process-per-connection)模型,每当一个客户端建立连接时,Postgres 主进程会 fork 出一个独立的后端进程来处理该连接的所有请求。这种模型的优势在于隔离性强、实现简单,但在高并发场景下会暴露明显瓶颈:每个进程占用约 5-10MB 内存,数百个连接就可能消耗数 GB 内存;大量进程间的上下文切换会显著增加 CPU 开销;文件描述符和共享内存锁的竞争也会加剧。在实际生产环境中,当连接数超过几百时,Postgres 的吞吐量不仅不再增长,反而可能下降。

为此,PgBouncer 和 Pgpool-II 等连接池中间件应运而生,它们在应用和数据库之间维护一个连接池,通过复用少量持久连接来服务大量客户端请求。PgBouncer 支持三种池化模式:会话级(session pooling)、事务级(transaction pooling)和语句级(statement pooling),其中事务级是最常用的模式,它在每个事务结束后将连接归还连接池。新一代 Postgres 兼容数据库(如 Amazon Aurora、Neon、Supabase 等)通常在架构层面重新设计了连接管理,以更好地适应云原生和微服务场景下的高并发需求。

Lakebase 作为 Postgres 兼容的服务,是否原生解决了这一问题,是评估其并发能力的重要指标。如果 Lakebase 采用了现代化的连接管理和自动扩缩容机制,理论上能更好地应对推理服务的突发流量;反之,若仍受限于经典 Postgres 的连接模型,团队则需要额外做容量规划。

Lakebase 相比传统 Postgres 的潜在"坑"

原帖作者特别询问了"与常规 Postgres 相比有哪些需要注意的地方"。虽然社区尚未给出大量实战反馈,但基于此类架构的通用规律,有几个值得关注的方面。

一致性与延迟的权衡

湖仓架构通常在写入后需要经过提交、快照等流程,数据从写入到可被查询之间可能存在延迟。对于需要"写后即读"(read-your-writes)的特征更新场景,这一点必须仔细验证,否则可能出现推理时读到过期特征的问题。

这一问题与"训练-服务一致性"(Training-Serving Consistency)密切相关。训练-服务一致性要求模型在训练阶段使用的特征,与在线推理阶段获取的特征在定义、计算逻辑和数据来源上完全一致。如果训练时使用了离线批处理管道生成的特征,而推理时通过不同的实时管道计算特征,即便逻辑"相同",由于数据处理时序、精度差异、聚合窗口不同等细微差别,也可能导致所谓的"训练-服务偏差"——模型上线后离线评估指标优秀但在线效果不佳。

谷歌在其经典论文《Machine Learning: The High-Interest Credit Card of Technical Debt》中将此类问题列为 ML 系统最常见的技术债务之一。这篇 2015 年发表于 NeurIPS 的论文系统性地总结了 ML 系统中模型代码仅占极小比例,而大量工程复杂度隐藏在数据收集、特征抽取、配置管理、模型验证和服务基础设施等"胶水代码"中。除了训练-服务偏差外,论文还指出了数据依赖(Data Dependencies)比代码依赖更难追踪、反馈循环(Feedback Loops)导致模型行为不可预测、以及配置债务(Configuration Debt)等问题。这些洞察促使了 MLOps 作为一个工程学科的兴起,也是 Feature Store、模型注册表(Model Registry)、实验追踪(Experiment Tracking)等工具出现的理论背景。

Lakebase 通过让训练和服务共享同一份数据存储,从架构层面降低了这种偏差的风险,这也是其对 ML 团队最具吸引力的特性之一。但前提是写入后的数据能被及时读取,否则一致性承诺将大打折扣。

冷启动与缓存预热

如前所述,存算分离架构对缓存高度依赖。在服务重启、扩容或访问模式突变时,缓存预热不足可能导致短时间内延迟飙升。生产环境中需要设计合理的预热和监控机制。具体而言,缓存预热策略通常包括:在服务启动时主动加载热点数据的"预加载"模式、通过分析历史访问日志预测热点的"预测性预热"、以及在蓝绿部署或金丝雀发布期间让新实例逐步承接流量以自然填充缓存的"渐进式预热"。对于 ML 特征服务,如果能识别出高频查询的实体 ID 集合(例如日活用户列表),在服务扩容时提前将这些实体的特征加载到缓存中,就能有效避免冷启动带来的延迟抖动。

成本模型差异

与固定实例的 Postgres 不同,湖仓类服务往往采用按用量计费。Databricks 使用 DBU(Databricks Unit)作为计费单位,不同工作负载类型(SQL 仓库、Jobs 计算、Serverless 等)的 DBU 单价各异。在高并发、持续查询的 ML 服务场景下,计算资源的持续占用可能导致 DBU 消耗远超预期。相比之下,固定实例的 Postgres(如 RDS)采用预留实例或按小时计费的模式,成本相对可预测。团队需要提前评估成本模型,使用 Databricks 提供的成本计算器或通过小规模压测来估算真实负载下的费用,避免出现"性能达标但账单失控"的情况。

选型建议:何时考虑用 Lakebase 做 ML 特征服务

结合社区讨论和架构特性,可以给出几点务实的选型思路:

适合的场景:

  • 团队已经深度使用 Databricks/Lakehouse 生态,希望减少数据同步链路
  • 特征数据与训练数据同源,追求"训练-服务一致性"——这意味着训练管道和在线推理使用同一份特征数据,从根本上避免因数据同步延迟或计算逻辑差异带来的训练-服务偏差
  • 对延迟要求处于中等区间(几十毫秒可接受),而非极致的个位数毫秒
  • 特征查询模式具有较好的局部性,热点数据集中在可缓存的范围内

需谨慎的场景:

  • 对 P99 延迟有严苛要求(如个位数毫秒)的高频交易类推理
  • 已有成熟的专用特征存储(如 Redis + Feature Store)且运行良好
  • 团队缺乏对湖仓架构缓存与调优的经验积累
  • 工作负载呈长尾分布,大量低频实体查询可能导致缓存命中率不足

此外,混合架构也是一种务实的折中方案:将 Lakebase 用作离线特征存储和中等延迟的在线查询层,同时保留 Redis 等专用缓存来服务对延迟最敏感的热路径。这种"分层服务"的思路在工业界已有广泛实践,例如 LinkedIn 的特征平台就采用了 Venice(在线层)+ 离线数据湖的双层架构。

结语

Lakebase 代表了数据基础设施"统一化"的一个重要方向——用一套系统同时承载分析与服务负载,这对简化 MLOps 架构极具吸引力。但正如 Reddit 社区这位开发者的疑问所揭示的,理念上的优雅并不等于生产环境的现成答案。

延迟、并发、一致性与成本,这四个维度依然需要在真实工作负载下反复验证。对于正在评估的团队,建议先用真实的特征查询模式做压测,重点关注 P99 延迟和缓存命中表现,再决定是否将其纳入关键的推理链路。压测时应模拟真实的查询分布(而非均匀随机),包括热点实体和冷门实体的比例、查询并发度的波动模式、以及缓存冷启动后的恢复时间。在缺乏大规模实战案例的当下,"小步验证、逐步推进"仍是最稳妥的策略。

核心要点

#Lakebase#ML实时特征服务#特征查询#Databricks湖仓架构#Feature Store选型#MLOps数据库#Postgres替代方案#实时推理延迟
分享:

相关推荐