流处理基础概念:数据流 vs 批量数据,有界流 vs 无界流,实时性 vs 准实时性

大家好,我是老张。今天咱们聊聊流处理的基础概念。说实话,很多刚接触流处理的同学,一上来就被各种术语搞懵了。什么是有界流?什么是无界流?实时和准实时到底差在哪?别急,我一个一个给你拆开讲。

数据流 vs 批量数据:两种截然不同的世界观

先说说最核心的区别。批量数据处理,说白了就是「攒够了再算」。你想想看,传统的 MapReduce、Hive 作业,都是先把数据存到 HDFS 上,然后定时跑个任务去算。数据是静止的,你什么时候算都行。

但数据流不一样。数据是源源不断流过来的,就像水管里的水。你不能等水攒满一桶再处理,那黄花菜都凉了。流处理的核心思想是「来一条处理一条」,或者「来一批处理一批」。

核心区别一句话总结:

  • 批量数据:数据先落地,再计算。延迟高,吞吐大。
  • 数据流:数据边来边算。延迟低,吞吐可调。

我在项目中遇到过这样一个场景:有个电商客户要做实时大屏,监控每秒钟的订单量。如果用批量处理,每5分钟跑一次任务,那大屏上的数字就是跳一下、停5分钟,用户体验极差。换成流处理之后,每秒更新一次,效果完全不一样。

有界流 vs 无界流:边界在哪?

这个概念其实很好理解。有界流,就是数据有明确的起点和终点。比如你处理「今天0点到24点的所有日志」,这就是有界流。数据是有限的,处理完就结束了。

无界流呢?数据没有终点。比如传感器数据、用户点击流、股票行情。理论上数据会一直来,永远不会停。你没法等所有数据到齐再算,因为永远到不齐。

特性 有界流 无界流
数据范围 有限,有明确边界 无限,无明确终点
处理方式 可以一次性全量处理 必须增量、持续处理
典型场景 T+1报表、历史数据回溯 实时监控、在线推荐
状态管理 简单,无需持久化状态 复杂,需要维护长时间运行的状态

嗯,这里要注意。很多流处理框架,比如 Flink,其实既能处理有界流也能处理无界流。你想想看,Flink 把批处理看作「有界流」的一种特例。这个设计思路很巧妙——一套引擎搞定所有场景。

我的经验:刚开始用 Flink 的时候,我习惯把批处理和流处理分开想。后来发现,用「有界 vs 无界」的视角去看,反而更清晰。你只需要关心数据有没有终点,剩下的交给框架。

实时性 vs 准实时性:别被「实时」忽悠了

这个问题我经常被问到:「老张,我们的系统要做到实时,延迟多少算实时?」

说实话,真正的「实时」是个理想状态。从数据产生到处理完成,延迟为零——这几乎不可能。实际工程中,我们更多讨论的是「准实时」。

  • 实时:毫秒级延迟。比如金融交易、风控拦截。数据到了就要立刻出结果。
  • 准实时:秒级到分钟级延迟。比如实时大屏、监控告警。可以接受几秒甚至几十秒的延迟。

我曾经踩过一个坑。有个项目要求「实时推荐」,客户说必须毫秒级。我们上了 Flink,用了复杂的状态后端,结果发现业务逻辑里有个外部 RPC 调用,一次就要几十毫秒。折腾半天,最后发现客户真正需要的是「秒级更新」就够了。所以,别被「实时」这个词绑架,先搞清楚业务到底能接受多少延迟。

避坑指南:我曾经见过一个团队,为了追求所谓的「实时」,把架构搞得极其复杂。结果线上跑起来,延迟反而比简单的准实时方案还高。记住:实时性是有代价的。延迟越低,系统复杂度越高,成本也越高。先问业务,再定方案。

流处理系统的核心特征

聊了这么多,那一个真正的流处理系统,应该具备哪些特征?我总结了几点:

  1. 低延迟:数据从产生到处理完成,延迟要可控。毫秒级还是秒级,看业务需求。
  2. 高吞吐:能扛住每秒百万级甚至千万级的数据量。不能一压就垮。
  3. 状态管理:流处理不是无状态的。你要记住「之前发生了什么」,才能做聚合、关联、去重。状态怎么存、怎么恢复,是核心难点。
  4. Exactly-Once 语义:数据不丢不重。这个在金融场景尤其重要。你想想,一笔交易被重复处理两次,那还得了?
  5. 容错与恢复:系统挂了怎么办?能不能从 checkpoint 恢复?恢复速度够不够快?
  6. 时间语义支持:事件时间、处理时间、摄入时间。这三个概念搞不清楚,流处理就白学了。

核心特征速记:低延迟、高吞吐、有状态、Exactly-Once、能容错、懂时间。

我个人习惯把流处理系统比作「一条永不停止的生产线」。数据是原材料,算子就是工位,状态就是半成品仓库。生产线不能停,原材料不能丢,半成品不能乱。嗯,这么一想,是不是好理解多了?

知识体系总览

下面这张图,我把本章的核心概念串起来了。你一看就明白:

流处理基础概念知识体系 数据源 有界流(有限数据) 无界流(无限数据) 流处理系统 核心特征:低延迟、高吞吐、状态管理 实时性要求 实时(毫秒级) 准实时(秒级) 数据处理范式 批量数据 数据流 总结:有界/无界决定处理策略,实时/准实时决定延迟要求,流/批量决定架构选型

你看,整个知识体系其实就围绕三个维度展开:数据有没有边界(有界 vs 无界)、延迟要求多高(实时 vs 准实时)、处理范式选哪个(流 vs 批量)。搞懂这三个维度,流处理的基础就算打牢了。

我的建议:刚开始学流处理,别急着上手写代码。先把这些概念理清楚。我见过太多人,代码写得飞起,结果连「事件时间」和「处理时间」都分不清。基础不牢,地动山摇。


公众号:蓝海资料掘金营,微信deep3321