我有兴趣获得有关两阶段提交协议在具有多个接收器时如何在 Flink 中工作的更多详细信息。我对两种情况感兴趣:
- 当两个接收器都支持 2PC 时
- 当其中一个支持2PC而另一个不支持时
是否保证分布式事务适用于所有接收器,或者我们每个接收器具有不同的事务?换句话说,如果两者都支持 2PC,其中一个接收器失败,另一个能够提交,会发生什么?
在 Flink 中,每个接收器负责自己的状态管理,包括任何 2PC 协议实现。这种划分是必要的,因为某些接收器根本不支持 2PC。
当 Flink 中触发检查点时,2PC sink 将启动预提交。仅当该预提交成功时,才会继续使用检查点。当整个执行图的检查点成功获取(存储所有运算符/UDF 的状态(时,作为检查点的最后阶段,接收器将执行实际提交。
回到你的问题:如果任何接收器未能提交,检查点将失败,整个 Flink 应用程序也将失败,因此它会在最后一个成功创建的检查点重新启动。