我们有一个Flink设置,Kafka生产者目前至少使用一次语义。关于Kafka生产者,我们正在考虑只切换到一次语义,因为这将为我们带来好处。不过,考虑到文档,这似乎会增加我们目前没有的数据丢失风险。如果由于Flink无法恢复或Kafka代理关闭,我们有很长的停机时间,Kafka交易可能会过期,数据也会丢失。
如果Flink应用程序崩溃和完成重新启动之间的时间为>超过Kafka的事务超时将导致数据丢失(超过超时时间的事务将自动中止(。
这似乎是一个全新的风险,至少在一次语义中不存在,无法减轻。无论设置了什么巨大的事务超时,都可能在现实世界中达到它。在我看来,最好的方法是有很短的检查点间隔,因为这会导致事务关闭,但仍然有很大的事务超时(以小时为单位(,这样就可以减少数据丢失的机会。我的理解正确吗?
您的理解是正确的。
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