Apache Flink 提供了一种容错机制来一致地恢复数据流应用程序的状态。该机制确保即使出现故障,程序的状态最终也会恰好反映数据流中的每条记录一次。
我需要在以下链接中了解答案: Flink 恰好一次消息处理
这是否意味着 Flink Sink 会像 Cassandra 这样的外部系统产生重复的事件?
例如:
1 - 我有以程:源 -> flatMap,状态为 -> 接收器,并将快照间隔配置为 20 秒。
如果任务管理器在两个快照之间关闭(已终止((从最后一个快照开始 10 秒后,在下一个快照之前 10 秒(,会发生什么情况。
我所知道的是,Flink 将从最后一个快照重新启动作业。
在这种情况下,接收器将重新处理在上次快照和停机时间之间已处理的所有记录?
在你描述的场景中,Flink 接收器确实会重新处理自上次快照以来之前发送给它的记录。
但这并不一定意味着连接到接收器的外部数据存储(例如,数据库、文件系统或消息队列(最终会保留这些重复项。Flink 可以提供我们有时所说的"恰好一次端到端"保证,如果接收器支持事务,或者数据以幂等方式写入。
Flink 的 Kafka 生产者和 StreamingFileSink 是可以利用事务来避免产生重复(或不一致(结果的接收器示例。
Cassandra 的情况稍微复杂一些——参见文档——如果你使用幂等查询,Flink 只能提供恰好一次的语义。