数据流基础:实时计算的核心概念

大家好,我是你们的老朋友。今天我们来聊聊数据流。

说实话,很多刚入行的同学,一听到「数据流」三个字,就觉得很高大上。其实没那么玄乎。我个人的理解很简单——数据流就是「源源不断、持续到达的数据序列」。就像自来水管道里的水,不是一桶一桶搬过来的,而是拧开龙头就一直流。

什么是数据流?

数据流,英文叫 Data Stream。它有几个关键特征:

  • 持续到达:数据是连续产生的,没有明确的终点
  • 无界:你不知道下一秒会来多少数据,也不知道什么时候结束
  • 实时性:数据产生后,需要尽快被处理

举个例子。你在淘宝上买东西,每秒钟都有成千上万的用户在下单、浏览、加购物车。这些行为数据就是一条条数据流。我当年在电商公司做风控时,每天要处理上亿条这样的实时行为数据。嗯,那时候才真正体会到什么叫「数据流」。

核心要点:数据流不是静态的数据集,而是动态的、持续流动的事件序列。

数据流 vs 批处理:到底差在哪?

很多同学会问:数据流和批处理,不都是处理数据吗?有什么区别?

区别大了去了。我做个对比你就明白了。

对比维度 批处理 数据流处理
数据范围 有界数据(已知大小) 无界数据(持续到达)
处理时机 数据全部到位后处理 数据到达即处理
延迟 分钟级到小时级 毫秒级到秒级
典型场景 日报、月报、离线分析 实时风控、实时推荐、监控告警
存储方式 HDFS、数据仓库 消息队列、内存状态

说白了,批处理是「先攒着,攒够了再一起算」。数据流是「来一条算一条,边来边算」。你想想看,做实时风控的时候,用户刚点了一下「支付」,你总不能等攒够一万条再判断这笔交易是不是欺诈吧?那黄花菜都凉了。

我的经验:在风控场景中,批处理适合做离线模型训练和事后分析,数据流处理适合做实时决策。两者不是替代关系,而是互补关系。

实时数据流的三大特征

做实时数据流处理,你必须理解它的三个核心特征。我当年踩过的坑,大多跟没理解透这些特征有关。

1. 高吞吐

什么叫高吞吐?就是单位时间内处理的数据量非常大。在风控场景中,每秒几万甚至几十万条事件是家常便饭。

为什么会这样?因为互联网用户太多了。双十一的时候,支付宝每秒要处理几十万笔交易。每一笔交易背后,还有点击、浏览、加购等行为数据。这些数据全部汇入数据流,压力可想而知。

我曾经遇到过一个项目,上线第一天流量就超过了预估的10倍。结果消息队列直接被打爆,数据大量积压。嗯,从那以后,我再也不敢低估「高吞吐」这三个字了。

避坑指南:设计数据流系统时,一定要预留2-3倍的吞吐余量。我曾经因为只留了50%的余量,结果流量高峰时系统直接挂了。血的教训。

2. 低延迟

低延迟,就是数据从产生到处理完成的时间非常短。在实时风控中,这个时间通常要求在100毫秒以内。

为什么这么苛刻?你想想看,用户点击「支付」按钮后,如果系统要等3秒才告诉你「这笔交易有风险」,用户早就等得不耐烦了。更糟糕的是,如果延迟太高,欺诈分子可能已经完成了交易,钱都转走了。

我个人的习惯是:把延迟目标定在50毫秒以内。这样即使有波动,也能保证在100毫秒内完成处理。

3. 无序性

这个特征最容易被忽视,也最容易出问题。

数据流的无序性,指的是数据到达的顺序,不一定等于数据产生的顺序。举个例子:用户在手机上操作,网络信号不好,第一条数据可能比第二条数据晚到。或者数据经过多个节点转发,路由路径不同,到达时间也不同。

为什么会这样?因为网络传输本身就不保证顺序。再加上分布式系统的复杂性,数据乱序是常态,有序才是特例。

我记得有一次做实时风控,用户先登录、后下单,结果系统先收到了下单事件,后收到了登录事件。如果按照到达顺序处理,就会判断「用户没登录就下单」,直接拦截掉。这显然是个误判。

解决方案:处理无序数据,通常有两种方式:

  • 事件时间处理:以数据产生的时间为准,而不是到达时间
  • 水位线机制:设置一个等待窗口,允许一定范围内的乱序

知识体系总览

说了这么多,我们来画一张图,把今天的内容串起来。

数据流基础:知识体系 数据流 (Data Stream) 数据流 vs 批处理 三大核心特征 高吞吐 每秒处理数十万事件 低延迟 毫秒级响应 无序性 事件时间 ≠ 到达时间 预留2-3倍余量 目标50ms以内 事件时间 + 水位线

这张图把今天的内容都串起来了。中心是数据流,左边是它和批处理的对比,右边是三大特征以及对应的应对策略。你保存下来,以后做架构设计时可以参考。

小结

今天的内容就到这里。总结一下:

  • 数据流是持续到达、无界的实时数据序列
  • 数据流处理和批处理有本质区别,延迟和范围是核心差异
  • 实时数据流的三大特征:高吞吐、低延迟、无序性
  • 处理无序数据,要用事件时间和水位线机制

这些概念是后续所有内容的基础。你把它吃透了,后面学窗口计算、状态管理、背压机制都会轻松很多。

最后说一句:我见过太多人一上来就学Flink、Kafka的API,结果遇到乱序数据就懵了。基础概念不牢,后面全是坑。所以,别急,慢慢来。

专注资料整理