-
1.at-most-once: 故障发生之后,计数结果可能丢失。同样的还有udp。
-
2.at-least-once: 计数程序在发生故障后可能多算,但是绝不会少算。
-
3.exactly-once: 这指的是系统保证在发生故障后得到的计数结果与正确值一致。
Flink的一个重大价值在于,它既保证了exactly-once,也具有低延迟和高吞吐的处理能力。 -
1.内部保证 —— 依赖checkpoint
-
2.source 端 —— 需要外部源可重设数据的读取位置
-
3.sink 端 —— 需要保证从故障恢复时,数据不会重复写入外部系统
而对于sink端,又有两种具体的实现方式:幂等(Idempotent)写入和事务性(Transactional)写入。
1.幂等写入
所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用了。
比如向hash表中写入数据.
2.事务写入
需要构建事务来写入外部系统,构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把所有对应的结果写入 sink 系统中。
对于事务性写入,具体又有两种实现方式:预写日志(WAL)和两阶段提交(2PC)。DataStream API 提供了GenericWriteAheadSink模板类和TwoPhaseCommitSinkFunction 接口,可以方便地实现这两种方式的事务性写入。
sink&source | 不可重置 | 可重置 |
---|---|---|
任意 | At-most-once | At-least-once |
幂等 | At-most-once | Exactly-once(故障时会出现暂时不一致) |
预写日志 | At-most-once | At-least-once |
两阶段提交 | At-most-once | Exactly-once |