1,什么是二阶段提交?
TwoPhaseCommitSinkFunction
Flink 已经为我们提供了实现 Exactly-Once 的 FlinkKafkaProducer 类。如下图所示:它实现了 TwoPhaseCommitSinkFunction
类,并重写了其中的方法,通过 2PC (Two Phase Comit) 二阶提交的方式,实现了 Exactly-Once。
使用关系型数据库 MySQL,开启 CheckPoint 机制的前提下,为了保证前一次 CheckPoint 成功后到这次 CheckPoint 成功之前这段时间内的数据不丢失,如果执行到一半过程任务失败了,从而导致前一次CheckPoint成功后到任务失败前的数据已经存储到了MySQL,然而这部分数据并没有写入到 CheckPoint。如果任务重启后,前一次CheckPoint成功后到任务失败前的数据便会再次写入MySQL,从而导致数据重复的问题。
这种情况,便使用到了 TwoPhaseCommitSinkFunction
类,以此来实现 MySQL 关系型数据库的二阶提交。
2,需要什么条件?
sink对象需要支持事务,很可惜大部分都不支持,那怎么办呢?
目前解决方案就是不停重复的写,或者写入缓存,或者写入外部。
JBDC案例: