无界流和有界流
无界数据流:
- 持续生成的, 本质上无限的数据集合
- 数据会随时间的推演而持续增加,计算持续进行且不存在结束的状态
有界数据流:
- 有限的数据集合
- 数据大小固定,计算最终会完成并处于结束的状态
状态
我们在设计一个微服务程序的时候, 往往追求服务是无状态的——这是因为要满足快速扩容、弹性缩容的要求。
而对于无状态, 实际要求我们的接口满足幂等性-即无论多少次访问接口,同样的输入总能得到同样的输出。
这里的状态,指的就是中间计算结果。
但是流计算本质属于’增量处理’, 通常需要不断查询、保持状态;
时间语义
Time
- Event Time(很重要), 事件实际发生的时间
- Ingestion Time(不太重要), 数据进入流处理引擎的时间
- Processing Time(重要), 流计算引擎真正开始处理事件的时间

Watermarks, 水位线
预估收到数据的截止时间。决定窗口是否触发, 小于水位线的数据默认丢弃。
Window
流处理应用中, 数据是连续不断的,因此我们不可能等所有数据都到了才处理。通常我们可以每来一个消息就处理一次, 但是有时我们需要做一些聚合类的处理。
比如: 在过去的1小时内,有多少用户访问了我们的网页。
为满足这种需求, 我们可以定义一个窗口, 用来收集最近1小时的数据, 并对窗口内的数据计算。
窗口可以是时间驱动(Time Window, 例如:每分钟), 也可以数据驱动(Count Window, 例如:每1000条记录)。
通常把窗口分为三类:
滚动窗口, Tumbling Window
- 将数据依据固定窗口长度进行切割
- 时间对齐,窗口长度固定,无重叠
滑动窗口,Sliding Window
- 窗口按照固定长度,平滑地对数据一直(实际上有滑动间隔)切割
- 窗口长度固定,有重叠
会话窗口
- 一段时间内没有接收到新数据就会生成新的窗口
- 时间不对齐
Trigger
触发器。决定了一个窗口何时能被计算或清除, 每个窗口都会拥有一个自己的Trigger。