目的:保证数据在生产,消费,sink端都只被精确一次。保证结果一致性。
为了达到这目的,采用的措施有:
1,生产端:往Kafka生产数据时有幂等,ack,事务,三个措施。
ps:幂等:无论数据输入多少次,只被记录一次
ack:生产者往Kafka的topic的某个分区写数据时的一个机制。当ack=0:生产者只管发送数据到patition,不需要等待patition汇报完成,性能最好。当ack=1:生产者发送数据时,需要等待一个分区副本汇报完成即可返回。当ack:-1:生产者在发送数据时需要等待所有的副本都保存成功才能返回,安全性最好。
事务:批量操作,要么全部成功要么全部失败。
2,消费端
通过check point保存每次计算的状态和消费的偏移量到HDFS。这个过程从source到sink。
3,sink端
Flink sink可以到mysql或者kafka,如果写入到mysql。则,因为有check point 所以可以做到Exactly once。但是写入到Kafka中的数据无法撤回,所以在写入kafka时可以可以在两个check point中间写入的数据作为一次事务(要么都写入成功,要么都写入失败),开启事务会导致数据的延时。
标签:Exactly,point,ack,Flink,写入,sink,发送数据,once From: https://www.cnblogs.com/ikssss/p/16909699.html