背景:
flink在开启checkpoint的时候有两种模式可以选择,exact-one和atleastone模式,那么这两种模式有什么区别呢?
exact-one和atleastone模式的区别
先说结论:exact-one可以完全做到状态的一致性,而atleastone模式正常情况下没法做到状态的一致性,如果开启这个模式,有些消息会重复处理,例如统计计数时,重复的消息会导致统计两次
那么为什么会这样呢?原理如下:
简单来说,主要的区别在于两种模式下对于接收到ckp分隔符后对齐过程中是否继续处理已经收到ckp分隔符的chanel的记录的不同,exactone是ckp分隔符对齐过程中先缓存记录不处理,而atleastone在ckp分隔符对齐过程中正常处理消息,这样这些消息就会被当成这次ckp的状态的一部分,而其实它不应该是这次ckp状态的一部分,而在应用从最新的ckp启动后,这些记录又有重新消费,叠加上之前已经成为ckp状态的那一次,相当于消息被重复处理了两次,所以才被称为atleastone模式
彩蛋:那么atleastone有可能达到exactone一样的效果吗?
有,前提是作业不需要包含对齐操作,也就是比如只包含map,fliter等并行算子,完全不需要分隔符对齐,但是这种情况下应该直接设置为exactone就完事了,不用故意使用atleastone的