Flink exactly once 语义和数据丢失

Flink exactly once semantics and data loss

我们有一个 Flink 设置,目前使用 at-least-once 语义的 Kafka 生产者。我们正在考虑切换到关于 Kafka 生产者的 exactly-once 语义,因为这会给我们带来好处。不过考虑到文档,这似乎会增加我们目前没有的非常可能的数据丢失风险。如果由于 Flink 无法恢复或 Kafka broker 宕机导致长时间停机,Kafka 事务可能会过期并且数据将会丢失。

If the time between Flink application crash and completed restart is > larger than Kafka’s transaction timeout there will be data loss (Kafka will automatically abort transactions that exceeded timeout time).

这似乎是一个全新的风险,它不存在于至少一次语义中并且无法减轻。无论设置了多大的事务超时,在实际情况下都可能会达到。在我看来,最好的方法是设置非常短的检查点间隔,因为它会导致事务关闭,但事务超时仍然非常大(以小时为单位),以便尝试减少数据丢失的机会。我的理解正确吗?

你的理解是正确的。

FWIW:这仅适用于计划外停机。当您升级您的应用程序时,或者当您想要将其关闭更长时间时,您应该始终使用“停止”命令 [1],这将在关闭时提交所有外部事务。

[1] https://ci.apache.org/projects/flink/flink-docs-release-1.12/deployment/cli.html#stopping-a-job-gracefully-creating-a-final-savepoint