传送门:Flink 系统性学习笔记
在学习 ProcessFunction 之前,我们先来回顾一下 Flink 的抽象级别。Flink 为我们提供了不同级别的抽象层次来开发流处理和批处理应用程序:

在最底层有状态流处理中没有定义任何具体的算子(比如 map,filter,或者 window),而是提供一个统一的处理操作。它是所有转换算子的一个概括性的表达,可以自定义处理逻辑,所以这一层接口就被叫作处理函数。
我们之前学习的转换算子,一般只是针对某种具体操作来定义的,能够拿到的信息比较有限。比如 map 算子,我们实现的 MapFunction 中,只能获取到当前的数据,定义它转换之后的形式;而像窗口聚合这样的复杂操作,AggregateFunction 中除数据外,还可以获取到当前的状态(以累加器 Accumulator 形式出现)。但是无论哪种算子,如果我们想要访问事件的时间戳,或者当前的 Watermark 信息,一般很难做到。跟时间相关的操作,目前我们一般会用窗口来处理。而在很多应用需求中