public enum CheckpointingMode {
EXACTLY_ONCE, //BarrierBuffer
AT_LEAST_ONCE;//BarrierTracker
private CheckpointingMode() {
}
}
Exactly Once 某个算子的 Task 有多个输入通道时,当其中一个输入通道收到 Barrier 时,Flink Task 会阻塞处理该通道,其不会处理这些数据,但是会将这些数据存储到内部缓存中,一旦完成了所有输入通道的 Barrier 对齐,才会继续对这些数据进行消费处理。
At least Once,同样针对某个算子的 Task 有多个输入通道的情况下,当某个输入通道接收到 Barrier 时,即使没有完成所有输入通道 Barrier 对齐,会继续处理数据。所以使用At Least Once 不能保证数据对于状态计算只有一次影响
flink两种exactly once 实现
FlinkKafka:TwoPhaseCommitSinkFunction 两阶段提交
StreamingFileSink:实现了CheckpointedFunction与CheckpointListener接口 两阶段提交