Apache Flink 中的端到端 Exactly-once 处理

Maz*_*ine 3 apache-kafka apache-flink flink-streaming exactly-once

Apache Flink 通过从检查点恢复作业来保证故障时的一次性处理和恢复,检查点是分布式数据流和算子状态的一致快照(分布式快照的 Chandy-Lamport 算法)这保证了故障转移时恰好一次。

在集群正常运行的情况下,Flink 如何保证一次处理,例如给定一个从外部源(比如 Kafka)读取的 Flink 源,Flink 如何保证事件从源读取一次?事件源和 Flink 源之间是否存在任何类型的应用程序级别确认?另外,Flink 如何保证事件从上游算子到下游算子只传播一次?这是否也需要对收到的事件进行任何类型的确认?

Dav*_*son 6

Flink 不保证每个事件都会从源中读取一次。相反,它保证每个事件只影响托管状态一次。

检查点包括源偏移量,在检查点恢复期间,源将被倒回,并且某些事件可能会重播。这很好,因为检查点包含了整个作业的状态,这些状态是读取检查点中存储的偏移量之前的所有内容而产生的,除了这些偏移量之外什么都没有。

因此,Flink 的恰好一次保证需要可重放的源。操作员之间的 Exactly Once 消息传递依赖于 tcp。

确保接收器不会收到重复的结果还需要事务接收器。Flink 将提交事务作为检查点的一部分。