source-flink-sink实现端到端的状态一致性

端到端(end-to-end)状态一致性

端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一致性,整个端到端的一致性级别取决于所有组件中一致性最弱的组件。具体可以划分如下:

  1. 内部保证 —— 依赖checkpoint
  2. source 端 —— 需要外部源可重设数据的读取位置(kafka/rocketmq)
  3. sink 端 —— 需要保证从故障恢复时,数据不会重复写入外部系统

而对于sink端,又有两种具体的实现方式:幂等(Idempotent)写入和事务性(Transactional)写入。

  1. 幂等写入

所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用了。

如redis(string,set,hash)、es、hbase天生具有幂等性。

  1. 事务写入

需要构建事务来写入外部系统,构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把所有对应的结果写入 sink 系统中。

 

对于事务性写入,具体又有两种实现方式:预写日志(WAL)和两阶段提交(2PC)。DataStream API 提供了GenericWriteAheadSink模板类和TwoPhaseCommitSinkFunction 接口,可以方便地实现这两种方式的事务性写入。

 

不同 Source 和 Sink 的一致性保证可以用下表说明:

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页