-
介绍
Flink和Kafka连接时可以实现精que一次(exactly-once)的保证。这是通过Flink的检查点(checkpoint)机制和Kafka的事务机制来实现的。
在Flink内部,检查点机制可以保证状态和处理结果的exactly-once语义。在输入端,Kafka可以对数据进行持久化保存,并可以重置偏移量(offset)。因此,我们可以在Source任务(FlinkKafkaConsumer)中将当前读取的偏移量保存为算子状态,写入到检查点中;当发生故障时,从检查点中读取恢复状态,并由连接器FlinkKafkaConsumer向Kafka重新提交偏移量,就可以重新消费数据、保证结果的一致性了。
在输出端,最jia实现exactly-once的方法当然就是两阶段提交(2PC)。Flink官方实现的Kafka连接器中,提供了写入到Kafka的FlinkKafkaProducer,它实现了TwoPhaseCommitSinkFunction接口。这意味着我们写入Kafka的过程实际上是一个两段式的提交:处理完毕得到结果,写入Kafka时是基于事务的“预提交”;等到检查点保存完毕,才会提交事务进行“正式提交”。如果中间出现故障,事务进行回滚,预提交就会被放弃;恢复状态之后,也只能恢复所有已经确认提交的操作。