一篇文章讲懂什么是“流(stream)”

142 阅读4分钟

一、引言

什么是stream?流究竟是什么?还有流式编程又是什么呢?

二、常见的 Stream 类型

Stream这个概念大家都不陌生,比如:

  • 学习 Java 初期接触的I/O stream
  • JDK8 中的stream api
  • Web 中的ServletInputStream/ServletOutputStream
  • 反应式流reactive streams
  • 大数据领域的Kafka streams/Spark Stream等等。

三、Stream 的定义与特性

定义

流是一组按特定顺序排列的元素序列。其元素会随着时间逐步出现,并且能够源源不断地产生,理论上可以是无限的。这就如同一条奔腾不息的河流,水持续流动,河里的水滴恰似流中的元素,新的水滴(元素)会不断加入。例如在网络数据传输中,数据以流的形式一点一点抵达接收端,像视频流、音频流在播放过程中,数据不断传输过来以供播放,而非一次性将整个视频或音频文件全部传输完毕后才开始播放。

特点

  1. 有序性:流中的元素具有明确的先后顺序,该顺序往往反映了它们产生或者被处理的先后逻辑。例如在实时日志流中,先产生的日志记录会处于流中相对靠前的位置。
  2. 动态性:流中的元素数量通常不是固定的,会持续有新元素添加进来。只要相关的数据源处于活动状态,就会不断产生新元素。比如股票交易数据的流,只要股市处于交易时段,交易数据就会不停地流入对应的流中。
  3. 一次性处理:在很多情况下,流中的元素在经过处理节点(如一个计算函数、过滤条件等)时往往只被处理一次,然后继续向后传递或者被丢弃等。这与传统的数据集不同,传统数据集可以反复多次进行遍历操作。
  4. 独立性较高:元素之间大概率互不影响。

四、流式编程

流被发明出来是为了解决问题,基于流的上述特点,流式编程应运而生。

(一)定义

流式编程是一种编程范式,它围绕流的概念构建程序逻辑,主要侧重于对连续不断、源源不断的数据序列(即流)进行处理。编程人员运用各种操作符(如映射、过滤、聚合等)将多个对流的处理步骤连接起来,形成一条处理流水线。数据从源头流入这条流水线,依次经过各个处理环节,最终输出处理后的结果。例如,对实时传感器采集的数据进行流式处理时,传感器不断传来温度、湿度等数据形成流,通过流式编程可以先过滤掉异常的错误数据(过滤操作),然后将有效的数据进行单位换算(映射操作),最后统计一段时间内的平均值(聚合操作)等。

(二)特点

  1. 实时性高:非常适合处理实时产生的数据,能够快速响应并处理新到达的数据元素。比如在实时监控系统中,一旦有新的监控数据流入流中,马上就能进行分析判断是否有异常情况,并及时发出告警。
  2. 低延迟:由于不需要等待所有数据都收集齐全后再进行处理(不像传统批处理那样),而是来一个数据就处理一部分,所以可以做到很低的延迟。例如电商平台实时统计当前时刻的订单成交量等情况,利用流式编程可以快速反馈给运营人员。
  3. 可扩展性强:可以通过增加计算资源等方式方便地应对更大流量的数据。比如在大数据流式处理平台中,随着数据源产生的数据量增大,可以通过增加服务器节点等方式来扩展处理能力,以确保对数据流的高效处理。

五、Stream 的应用

  • I/O stream:用于字节/字符流操作。
  • stream api:用于流式编程。
  • Web stream:用于字节流操作。
  • reactive streams:用于处理异步数据流。
  • Kafka streams:用于处理消息队列流数据。

以上这些stream都是不定长且以一个一个传输的元素集合形式存在。首先从“流(stream)”的概念引入,介绍常见的 Stream 类型,让读者对不同场景下的流有初步认识。接着详细阐述 Stream 的定义与特性,包括定义、特点等方面,使读者深入理解流的本质。然后引入流式编程,分别从定义和特点进行说明,强调其在处理连续数据方面的优势。最后列举 Stream 的应用场景,进一步加深读者对不同类型流的实际用途的了解。