我们有一个 Flink 设置,Kafka 生产者目前使用至少一次语义。我们正在考虑切换到关于 Kafka 生产者的一次性语义,因为这会给我们带来好处。不过考虑到文档,这似乎会增加我们目前没有的非常可能的数据丢失风险。如果由于 Flink 无法恢复或 Kafka 代理关闭而导致长时间停机,则 Kafka 事务可能会过期并且数据将丢失。
如果 Flink 应用程序崩溃和完成重启之间的时间大于 Kafka 的事务超时时间,则会出现数据丢失(Kafka 会自动中止超过超时时间的事务)。
这似乎是一种全新的风险,在至少一次语义中不存在并且无法减轻。无论设置了多大的事务超时,都可能存在实际情况。在我看来,最好的方法是设置非常短的检查点间隔,因为它会导致事务关闭但仍然是非常大的事务超时(以小时为单位),以便尝试减少数据丢失的机会。我的理解正确吗?