1. 实时数仓概述:从离线到实时的演进、Lambda与Kappa架构对比、状态一致性的重要性

1.1 从离线数仓到实时数仓:我们为什么要变?

说实话,我刚入行那会儿,做的全是离线数仓。每天凌晨跑批,早上看报表,数据延迟24小时是常态。那时候大家觉得这很正常——业务决策嘛,看昨天的数据就够了。

但后来不行了。用户点了个广告,你得立刻知道转化率;双十一大促,GMV要秒级刷新;风控场景里,一笔交易延迟几分钟可能就出大事。离线数仓的「T+1」模式,越来越扛不住。

我经历过一个典型的案例:某电商平台做实时大屏,离线数仓凌晨3点才产出昨天的销售数据,运营团队白天开会用的永远是「过期」信息。后来我们上了实时数仓,数据延迟压到10秒以内,运营终于能盯着大屏做决策了。

离线数仓和实时数仓的核心差异,我列个表你就明白了:

对比维度 离线数仓 实时数仓
数据延迟 小时级~天级(T+1) 秒级~分钟级
计算引擎 Hive、Spark SQL(批处理) Flink、Spark Streaming(流处理)
存储选型 HDFS、Hive表 Kafka、消息队列、OLAP引擎
数据一致性 强一致(事务保证) 最终一致(状态一致性挑战)
典型场景 月度报表、财务对账 实时大屏、风控、推荐

说白了,离线数仓追求的是「准」,实时数仓追求的是「快」。但问题来了——又快又准,能做到吗?这就是我们这门课要聊的核心。

1.2 Lambda与Kappa架构:两条不同的路

实时数仓刚兴起的时候,大家最先想到的是Lambda架构。我2018年参与过一个项目,就是典型的Lambda架构——批处理层跑全量数据保证准确性,流处理层跑增量数据保证低延迟,最后在服务层做合并。

听起来很完美对吧?但实际落地的时候,坑不少。

Lambda架构的核心痛点:

  • 两套代码(批处理+流处理),维护成本翻倍
  • 批流结果合并时,逻辑不一致导致数据对不上
  • 同一个指标,批处理算出来一个值,流处理算出来另一个值,业务方不知道该信谁

后来Kappa架构出现了。它的思路很简单:只用一套流处理引擎,所有数据都走流式处理。如果需要重算历史数据,就重新消费Kafka里的数据,从头跑一遍。

我个人的习惯是:如果业务场景允许数据最终一致,且Kafka能保留足够长的历史数据,我会优先选Kappa架构。少维护一套代码,少操一份心。

但Kappa架构也不是银弹。举个例子,你想想看——如果Kafka的Topic数据量巨大,重算一次要跑好几个小时,中间还可能出现状态不一致的问题,这时候你怎么办?

两种架构的对比,我整理了一下:

对比维度 Lambda架构 Kappa架构
核心思想 批处理+流处理并行,结果合并 统一用流处理,数据重放
代码维护 两套代码,维护成本高 一套代码,维护成本低
数据一致性 批处理保证强一致,流处理保证低延迟 依赖流处理引擎的状态一致性机制
历史重算 批处理层直接重算 重新消费Kafka数据
适用场景 对准确性要求极高,且能接受较高维护成本 数据量大、延迟敏感、能接受最终一致

下面这张图,是我自己画的一个Lambda与Kappa架构的对比流程图,帮你直观理解两者的差异:

Lambda vs Kappa 架构对比 Lambda 架构 实时数据流 流处理层(Speed Layer) 批处理层(Batch Layer) 服务层(Serving Layer) Kappa 架构 统一数据流(Kafka) 流处理引擎(Flink) 结果存储(OLAP/NoSQL) 核心差异 • Lambda:批流并行,两套代码,维护成本高,但历史重算快 • Kappa:统一流处理,一套代码,维护成本低,但重算依赖Kafka数据保留 • 选择建议:团队人力充足、对准确性要求极高 → Lambda;追求敏捷、能接受最终一致 → Kappa

1.3 状态一致性:实时数仓的「阿喀琉斯之踵」

聊完架构,咱们得聊聊这门课最核心的问题——状态一致性。

什么是状态?说白了,就是流处理过程中需要记住的「中间结果」。比如你算过去5分钟的UV,每个用户的访问记录就是状态;你算订单的累计金额,每一笔订单的金额就是状态。

状态一致性,就是保证这些中间结果在故障恢复后,依然准确无误。

我曾经踩过的一个坑:

有一次做实时订单统计,Flink任务运行了3天后突然挂掉。重启之后,发现统计结果比实际少了2万多笔订单。查了半天,发现是Checkpoint配置有问题,状态没有正确保存。业务方追着我问了一周,那滋味……嗯,从那以后我再也不敢忽视状态一致性了。

状态一致性为什么这么重要?我总结了三个原因:

  1. 数据准确性——实时数仓的输出直接驱动业务决策,数据错了,决策就偏了。
  2. 故障恢复——流处理任务跑几个月是常态,中间任何一次故障,都要保证恢复后数据不丢不重。
  3. 端到端一致性——从数据源到Kafka,再到Flink,最后到结果存储,每个环节都要保证一致,一个环节出问题,全链路的可信度就没了。

你想想看,一个实时大屏上显示「今日成交额1.2亿」,结果因为状态不一致,实际只有1.1亿。运营团队按1.2亿做了促销预算,最后对不上账——这种事故,谁扛得住?

我的建议:

刚开始接触实时数仓的同学,可以先从「至少一次」语义入手,保证数据不丢。等业务对准确性要求更高了,再升级到「精确一次」语义。一口吃不成胖子,状态一致性也是逐步完善的。

1.4 本章小结

这一章我们聊了三件事:

  • 离线数仓到实时数仓的演进,本质是业务对数据时效性的要求越来越高
  • Lambda和Kappa两种架构各有优劣,选型要看团队和业务场景
  • 状态一致性是实时数仓的基石,搞不定它,实时数仓就是空中楼阁

接下来的课程,我会带你一步步深入状态一致性的技术细节。从Flink的状态管理,到Checkpoint机制,再到端到端一致性保障——每一章都会有我踩过的坑和实战经验。准备好了吗?咱们开始吧。