Apache Flink 容错

Apache Flink fault tolerance

Apache Flink offers a fault tolerance mechanism to consistently recover the state of data streaming applications. The mechanism ensures that even in the presence of failures, the program’s state will eventually reflect every record from the data stream exactly once.

我需要理解下面的答案link:

这是否意味着Flink Sink会像Cassandra一样向外部系统产生重复事件?

例如:

1 - 我有以下流程:source -> flatMap with state -> sink 和配置的快照间隔为 20 秒。

如果任务管理器在两个快照之间(在上一个快照后 10 秒后和下一个快照前 10 秒后)关闭(终止),会发生什么情况。

据我所知,Flink 将从上次快照重新启动作业。

在这种情况下,Sink 将重新处理在上次快照和停机时间之间已经处理过的所有记录?

在您描述的场景中,Flink 接收器确实会重新处理自上次快照以来之前发送给它的记录。

但这并不一定意味着连接到接收器的外部数据存储(例如,数据库、文件系统或消息队列)将最终保留这些重复项。如果接收器支持事务,或者数据以幂等方式写入,Flink 可以提供我们有时所说的 "exactly-once end-to-end" 保证。

Flink 的 Kafka 生产者和 StreamingFileSink 是可以利用事务避免产生重复(或不一致)结果的接收器示例。

Cassandra 的情况稍微复杂一些 -- see the documentation -- 如果您使用幂等查询,Flink 只能提供恰好一次语义。