Flink源码分析-窗口
窗口机制是Flink流处理的核心,它将无限元素的流分割成有限元素的集合(窗口)。当一个窗口不再增加新元素时,就可以对这个窗口中的所有元素执行计算逻辑。
前言
从一个需求说起,业务方要实时计算每个商品在过去十分钟的展现、点击、购买数量来做运营活动,延迟不能超过一秒。商品的展现、点击、购买日志都会投递到消息队列,QPS大概在10W左右,计算结果存储在你redis中。
由于涉及到运营活动,数据的准确性和及时性非常重要。我们先思考下不借助框架,应该如何去实现这个需求,都有哪些实现方式?
这种需求的实现方式有多种,其中一种就是Window(窗口)。大致过程为把无限元素的流按时间 分割成有限元素的集合(窗口)。当窗口中元素不再新增元素时,对窗口中的元素执行计算逻辑,然后将计算结果发送给下游。当窗口中如果元素数量过多导致占用过多内存时,就需要预先执行增量计算来减少元素数量。从这个过程中,可以总结出三个核心的功能点:
- 分割窗口方式
- 窗口达到稳定状态时机
- 计算方式
在实际的应用场景中,还要考虑边界条件:
- 窗口元素过多,导致计算太慢或者占用内存过多
- 当一个窗口结束时,又收到应该属于这个窗口的元素
窗口分割方式
窗口类型:
- 滚动窗口
- 滑动窗口
- 会话窗口
时间:
- 事件发生时间
- 收到事件时间
- 处理事件时间
滚动窗口
滑动窗口
会话窗口
窗口触发器
窗口方法
ReduceFunction
AggregateFunction
FoldFunction
ProcessWindowFunction
延迟
参考: