首页 > 解决方案 > Kafka commitTransaction 确认失败

问题描述

根据 Kafka 的commitTransaction文档,如果在特定时间内没有收到响应,commitTransaction将会失败TimeoutException

请注意,如果在 max.block.ms 到期之前无法提交事务,则此方法将引发 TimeoutException。此外,如果被中断,它将引发 InterruptException。在任何一种情况下重试都是安全的,但不可能尝试不同的操作(例如 abortTransaction),因为提交可能已经在完成中。如果不重试,唯一的选择是关闭生产者。

考虑一个应用程序,其中 Kafka 生产者将一组记录作为事务 A 发送。

记录成功发送到主题后,Kafka 生产者将执行commitTransaction. Kafka 集群接收到提交事务请求并成功提交作为事务 A 一部分的记录。Kafka 集群发送关于成功提交的确认。

但是,由于某些问题,此确认丢失,导致TimeoutKafka 生产者commitTransaction调用异常。因此,即使记录已在 Kafka 集群上提交,但从生产者的角度来看,提交失败了。

通常在这种情况下,应用程序会在新事务 B 中重试发送事务 A 记录,但这会导致记录重复,因为它们已经作为事务 A 的一部分提交。

上述情况可能吗?您如何处理由此导致的commitTransaction确认丢失和最终重复记录?

标签: apache-kafkaduplicateskafka-producer-apidistributed-systempacket-loss

解决方案


推荐阅读