一、引言
什么是stream
?流究竟是什么?还有流式编程又是什么呢?
二、常见的 Stream 类型
Stream
这个概念大家都不陌生,比如:
- 学习 Java 初期接触的
I/O stream
; - JDK8 中的
stream api
; - Web 中的
ServletInputStream/ServletOutputStream
; - 反应式流
reactive streams
; - 大数据领域的
Kafka streams/Spark Stream
等等。
三、Stream 的定义与特性
定义
流是一组按特定顺序排列的元素序列。其元素会随着时间逐步出现,并且能够源源不断地产生,理论上可以是无限的。这就如同一条奔腾不息的河流,水持续流动,河里的水滴恰似流中的元素,新的水滴(元素)会不断加入。例如在网络数据传输中,数据以流的形式一点一点抵达接收端,像视频流、音频流在播放过程中,数据不断传输过来以供播放,而非一次性将整个视频或音频文件全部传输完毕后才开始播放。
特点
- 有序性:流中的元素具有明确的先后顺序,该顺序往往反映了它们产生或者被处理的先后逻辑。例如在实时日志流中,先产生的日志记录会处于流中相对靠前的位置。
- 动态性:流中的元素数量通常不是固定的,会持续有新元素添加进来。只要相关的数据源处于活动状态,就会不断产生新元素。比如股票交易数据的流,只要股市处于交易时段,交易数据就会不停地流入对应的流中。
- 一次性处理:在很多情况下,流中的元素在经过处理节点(如一个计算函数、过滤条件等)时往往只被处理一次,然后继续向后传递或者被丢弃等。这与传统的数据集不同,传统数据集可以反复多次进行遍历操作。
- 独立性较高:元素之间大概率互不影响。
四、流式编程
流被发明出来是为了解决问题,基于流的上述特点,流式编程应运而生。
(一)定义
流式编程是一种编程范式,它围绕流的概念构建程序逻辑,主要侧重于对连续不断、源源不断的数据序列(即流)进行处理。编程人员运用各种操作符(如映射、过滤、聚合等)将多个对流的处理步骤连接起来,形成一条处理流水线。数据从源头流入这条流水线,依次经过各个处理环节,最终输出处理后的结果。例如,对实时传感器采集的数据进行流式处理时,传感器不断传来温度、湿度等数据形成流,通过流式编程可以先过滤掉异常的错误数据(过滤操作),然后将有效的数据进行单位换算(映射操作),最后统计一段时间内的平均值(聚合操作)等。
(二)特点
- 实时性高:非常适合处理实时产生的数据,能够快速响应并处理新到达的数据元素。比如在实时监控系统中,一旦有新的监控数据流入流中,马上就能进行分析判断是否有异常情况,并及时发出告警。
- 低延迟:由于不需要等待所有数据都收集齐全后再进行处理(不像传统批处理那样),而是来一个数据就处理一部分,所以可以做到很低的延迟。例如电商平台实时统计当前时刻的订单成交量等情况,利用流式编程可以快速反馈给运营人员。
- 可扩展性强:可以通过增加计算资源等方式方便地应对更大流量的数据。比如在大数据流式处理平台中,随着数据源产生的数据量增大,可以通过增加服务器节点等方式来扩展处理能力,以确保对数据流的高效处理。
五、Stream 的应用
I/O stream
:用于字节/字符流操作。stream api
:用于流式编程。Web stream
:用于字节流操作。reactive streams
:用于处理异步数据流。Kafka streams
:用于处理消息队列流数据。
以上这些stream
都是不定长且以一个一个传输的元素集合形式存在。首先从“流(stream)”的概念引入,介绍常见的 Stream 类型,让读者对不同场景下的流有初步认识。接着详细阐述 Stream 的定义与特性,包括定义、特点等方面,使读者深入理解流的本质。然后引入流式编程,分别从定义和特点进行说明,强调其在处理连续数据方面的优势。最后列举 Stream 的应用场景,进一步加深读者对不同类型流的实际用途的了解。