1. 数据流
也称“事件流”或“流数据”,是无边界数据集的抽象表示。
事件流模型的特点:
- 无边界:所谓无边界,是因为随着时间的推移,新纪录会不断加进来
- 有序:事件的发生有先后顺序
- 数据记录不可变:事件一旦发生,就不能被改变
- 可重播
2. 三种编程范式
流式处理实质上是一种编程范式,为了更好的理解流式处理,先对比的了解下 请求与响应、批处理、流式处理这三种编程范式。
1)请求与响应
解释:应用程序向处理系统发出请求,然后等待响应。
特点:延迟最小的一种范式,处理模式一般是阻塞的。
2)批处理
解释:处理系统按照设定的时间启动处理进程。
特点:高延迟、高吞吐量。
3)流式处理
解释:实时地处理一个或多个事件流,整个处理过程必须是持续的,并且读取的数据集是无边界的。
特点:延迟介于上述两种范式之间。
3. 流式处理的几个概念
1)时间
在流式处理中,大部分流式应用的操作都是基于时间窗口的。
- 事件时间:所追踪事件的发生时间和记录的创建时间。
- 日志追加时间:事件保存到 broker 的时间。
- 处理时间:应用程序在收到事件之后要对其进行处理的时间。
2)状态
流式处理往往包含多个事件,而事件与事件之间的信息被称为“状态”。
- 本地状态或内部状态:这种状态只能被单个应用程序实例访问,优势是速度快,缺点是受内存大小的限制。
- 外部状态:这种状态使用外部的数据存储(例如 NoSQL 系统)来维护,优势是没有大小的限制,可以被多个实例或多个应用程序访问,缺点是引入额外的系统会造成更大的延迟和复杂性。
3)流和表的二元性
流包含了变更——流是一系列事件,每个事件就是一个变更。
表包含了当前的状态,是多个变更所产生的结果。
(二元性即事物的相对性)
4)时间窗口
大部分针对流的操作都是基于时间窗口的,对于时间窗口要考虑几个问题:窗口大小、移动频率、可更新的时间。
4. 流式处理的设计模式
1)单个时间处理
这个模式也叫 map 或 filter 模式
2)使用本地状态
3)多阶段处理和重分区
4)使用外部查找——流和表的连接
5)流与流的连接
流和流的连接也叫作基于时间窗口的连接(windowed-join)。
连接两个流,就是连接两个流的所有历史事件 —— 将两个流里具有相同键和发生在相同时间窗口内的事件匹配起来。
6)乱序事件
要让流处理应用程序处理好乱序事件,需要做到以下几点:
- 识别乱序事件;
- 规定一个时间段用于重排乱序的事件;
- 具有在一定时间段内重排乱序事件的能力;
- 具备更新结果的能力
7)重新处理
该模式有两个变种:
- 使用新版本应用处理同一个事件流,生成新的结果, 并比较两种版本的结果,然后在某个时间点将客户端切换到新的结果流上。
- 当现有的流式处理出现问题时,对当前数据流进行修复,修复完成后重新处理事件流并重新计算结果,这种模式涉及到了“重置”应用。