exactly-once的实现原理是什么
来源:9-9 Checkpoint整合重启策略功能测试screenflow

秋晨001
2023-07-24
-
要实现exactly-once是要结合flink的checkpoints吗?
如果是结合checkpoints的话,”当flink作业发生故障时,可以从最近的checkpoint快照恢复状态和流的位置“,针对这句话我有点疑问: -
如果我设置checkpointing.interval为5000,当恢复时就有可能回放最大5秒前的数据,但是如果在这5秒钟我已经处理了大量的数据,
那么在回放时我是不是会收到之前已经处理过的数据,进而发生数据重复消费的情况,这样它还是exactly-once吗? -
另外的一个疑惑是,如果在算子内部处理中,我调用了一个外部接口,当发生故障时,我正在拿着数据A来调用这个外部接口,外部接口的服务器可能已经收到了这个请求,也可能还没有收到请求。当恢复时flink对这个数据A调用外部接口是怎么处理的?是不会调用了还是会再次调用呢?
-
还有个不太懂,当flink到了保证快照时,但是我正在请求外部接口并等待外部接口的响应结果,假设要等很久,这个时候flink怎么保存当前的状态?
还希望老师可以对上面的问题一一解答,多谢老师了🙂
1回答
-
Michael_PK
2023-08-07
我把你的问题综合了下,进行如下总结:
1)要实现一次性语义,需要从三个角度去考虑:输入是否支持(比如说kafka是支持的,因为可以通过offset进行数据回放),计算是否支持(这个flink可以通过对应的state管理来完成),输出是否支持(这个是最难的,因为这部分并不是说flink自己的东西,而是要结合输出的框架,比如说mysql、redis之类的等待,那么此时就肯定要涉及到checkpoint)
2)实现原理可以参考这个文章:https://blog.csdn.net/weixin_39877754/article/details/119645461
3)上面的文章最终提炼,其实就是亮点,sink要一次性的话,要么就是要具备幂等性输出,要么就是两阶段提交(所谓两阶段提交就是要提交两次,第一次是预提交,第二次才是真正的提交)
10
相似问题