首页/数据/数据工程与 ETL 速查/Lambda 与 Kappa 架构取舍
管道基础52 条

Lambda 与 Kappa 架构取舍

Lambda 同时跑批处理层与速度层,用批层修正实时结果;Kappa 只保留流处理一条链路,历史重放靠消息保留或存储回放。

两种架构的取舍

Lambda 架构把同一条链路做成两套:速度层负责秒级近似结果,批处理层每天重算一份精确结果,查询时再用批层覆盖流层的数。这样能得到又准又快的指标,代价是同一口径要写两遍代码。Kappa 架构只保留流处理一条链路,口径变更时通过重放历史数据来修正结果,前提是数据源可以长期重放。选择哪一种,取决于「同一口径维护两套实现的成本」和「历史数据能不能重放」这两件事哪个更棘手。

基本信息

Lambda批层 + 速度层 + 服务层,最终以批层为准
Kappa单一流链路,口径变更靠重放历史
取舍Lambda 两套逻辑易漂移;Kappa 依赖可重放的数据源
Kappa 前提消息保留期足够长,或原始数据在对象存储上可回放
典型组件Flink/Spark 流作业、离线批作业、查询层合并

Lambda 典型数据流

Lambda 典型数据流
Kafka ─┬─→ 流作业(秒级)──→ 实时视图 ─┐
        └─→ 批作业(T+1)──→ 全量视图 ─┴─→ 查询层合并

典型使用场景

  • 实时大屏同时要求秒级可见与日终准确,Lambda 的分层最直接
  • 口径尚未稳定时用 Kappa,改逻辑只改一处再重放
  • 数据源是 Kafka 且保留期很短,只能依赖批层兜底
  • 业务规则复杂、流处理难以表达全部逻辑,批层承担主计算
  • 已有成熟批任务想逐步实时化,可先并存再收敛成单链路

两种架构对比

维度LambdaKappa
链路数量两条(流 + 批)一条(纯流)
口径一致性两套实现,需人工对齐单实现,天然一致
修正手段批层覆盖流层重放历史数据
时效与准确实时近似 + 日终精确取决于流作业本身
主要风险两套逻辑漂移对不上账源端保留不足导致无法补数
数据可长期重放(Kafka 大保留期或对象存储归档)时 Kappa 更易维护;否则批层仍是兜底。
两条链路合并时要明确「谁覆盖谁」以及覆盖发生的时刻,否则同一指标在同一天内会出现先升后降或反复跳变。

易错点

  • 两套代码实现同一口径,变更时只改一边会直接对不上账
  • Kappa 重放依赖源端保留窗口,消息过期后无法补数
  • 覆盖规则没定义清楚,查询层拿到的指标在批任务跑完前后不一致
  • 为追求架构先进而强上纯流,结果历史数据无法重放、问题无法回溯
  • 流作业与批作业使用不同的时间口径(事件时间与处理时间),合并后差异难以解释

数据来源与参考

  • Jay Kreps:Questioning the Lambda Architecture(O'Reilly Radar)
  • Apache Flink 官方文档相关讨论
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌