流处理基石:实时计算概念、Lambda 与 Kappa 架构对比、流批核心差异

大家好,欢迎来到《实时流处理性能调优实战》的第一章。

做实时计算这些年,我见过太多团队一上来就追新框架、调参数,结果连最基础的概念都没对齐。说白了,地基没打牢,楼盖得再高也是危房。这一章,咱们就把流处理的几个核心基石夯实了。

1.1 实时计算到底是什么?

先问个问题:你理解的「实时」是多快?

有人觉得秒级响应就算实时,有人要求毫秒级,还有人认为只要数据产生后能尽快看到结果就行。其实,在工程领域,实时计算指的是数据从产生到被处理并输出结果,整个延迟在可接受的短时间范围内(通常是秒级甚至毫秒级)。

我习惯把实时计算拆成三个关键特征:

  • 低延迟:数据流动快,处理速度快,不积压。
  • 持续处理:数据源源不断,系统7x24小时运行。
  • 事件驱动:每条数据到来都会触发计算逻辑。

举个例子,你在电商网站点了个「立即购买」,后台的实时风控系统必须在几百毫秒内判断这笔交易有没有风险。这就是典型的实时计算场景。

核心要点:实时计算不是「快批处理」,它的设计哲学是「事件一来,立刻处理」,而不是「攒一批,再处理」。

1.2 Lambda 架构 vs Kappa 架构

聊到实时计算,绕不开两个经典架构:Lambda 和 Kappa。我在2016年第一次给公司设计实时数仓时,就踩过 Lambda 的坑,后来才切到 Kappa。咱们来对比一下。

1.2.1 Lambda 架构

Lambda 架构把数据流拆成两条路:

  • 批处理层:处理全量历史数据,保证准确性,但延迟高。
  • 流处理层:处理实时增量数据,保证低延迟,但可能有误差。

最后通过一个「合并层」把两边的结果拼起来给用户。

听起来很完美对吧?但我在项目中遇到过一个问题:维护两套代码。批处理用 Hive/Spark SQL,流处理用 Flink/Storm,同样的业务逻辑要写两遍,还经常对不上结果。每次排查数据不一致,都像在破案。

避坑指南:我曾经因为 Lambda 架构中批流结果不一致,花了整整两周去对齐逻辑。后来发现是窗口边界定义不同。如果你非要用 Lambda,务必在代码层面统一批流的时间处理语义。

1.2.2 Kappa 架构

Kappa 架构就简单多了——只用一套流处理引擎。所有数据都走实时流,历史数据重算时,直接从消息队列的源头重新消费一遍。

它的核心假设是:消息队列(如 Kafka)能保存足够长的历史数据,并且流处理引擎能处理全量数据。

对比维度 Lambda 架构 Kappa 架构
代码维护 两套代码(批+流) 一套代码(纯流)
数据一致性 容易产生偏差 天然一致
历史重算 批处理层直接重算 重新消费 Kafka 数据
运维复杂度 高(两套系统) 低(单一引擎)
适用场景 对历史数据准确性要求极高 大部分实时数仓场景

我个人更倾向 Kappa 架构。你想想看,如果 Kafka 能保留7天甚至30天的数据,配合 Flink 的状态后端,大部分场景根本不需要批处理层。当然,如果你的业务要求对几年前的数据做精确回溯,Lambda 可能还是逃不掉。

我的建议:新项目优先考虑 Kappa 架构。如果实在需要批处理能力,可以用 Flink 的批流一体模式,而不是硬拆成两套系统。

1.3 流处理与批处理的核心差异

很多人觉得流处理和批处理只是「处理方式不同」,其实它们的底层思维模型完全不一样。

1.3.1 数据视角不同

  • 批处理:数据是「有界的」。你知道数据集有多大,什么时候结束。
  • 流处理:数据是「无界的」。你不知道下一秒会来多少数据,也不知道什么时候结束。

这个差异决定了后续所有的设计选择。

1.3.2 时间语义不同

批处理通常只关心「处理时间」——什么时候跑任务。但流处理必须区分:

  • 事件时间:数据实际发生的时间。
  • 处理时间:数据到达系统的时间。
  • 摄入时间:数据进入消息队列的时间。

我记得有一次做用户点击流分析,用处理时间做窗口,结果因为网络延迟,凌晨的数据被算到了早上8点的窗口里。嗯,从那以后我再也不敢忽略事件时间了。

1.3.3 容错机制不同

批处理失败了大不了重跑整个任务。流处理呢?系统跑了三天三夜,突然挂了,重启后怎么保证数据不丢不重?

流处理需要状态一致性机制,比如 Flink 的 Checkpoint + 精确一次语义。这比批处理的「重跑」复杂得多。

一句话总结:批处理是「关起门来算总账」,流处理是「边开门迎客边算账」。两者的架构设计、容错策略、性能优化思路完全不同。

1.4 本章知识体系总览

下面这张图,我把本章的核心知识点串了起来。你可以把它当作一张「地图」,后面每章都会在这张图上展开。

第1章:流处理基石知识体系 实时流处理 实时计算概念 低延迟 · 持续处理 · 事件驱动 Lambda vs Kappa 两套代码 vs 一套代码 流批核心差异 有界 vs 无界 · 时间语义 · 容错 核心结论:选对架构,理解差异,再谈调优 本章是后续所有性能调优章节的理论基础 后续章节将围绕「流批差异」中的每个点深入展开

1.5 本章小结

这一章我们聊了三件事:

  1. 实时计算的本质是低延迟、持续处理、事件驱动。
  2. Lambda 和 Kappa 架构各有优劣,我个人推荐新项目优先 Kappa。
  3. 流处理与批处理的核心差异在于数据边界、时间语义和容错机制。

这些概念看起来简单,但它们是后续所有性能调优决策的「坐标系」。比如,你为什么要调优?因为流处理的无界特性导致状态膨胀。你往哪个方向调?取决于你选的是 Lambda 还是 Kappa。你用什么手段调?得先理解事件时间和处理时间的区别。