Nin*_*tle 6 distributed-system duplicates packet-loss apache-kafka kafka-producer-api
根据Kafka的commitTransaction文档,如果在一定时间内没有收到响应,commitTransaction将会失败TimeoutException
请注意,如果在 max.block.ms 到期之前无法提交事务,则此方法将引发 TimeoutException。此外,如果中断,它将引发 InterruptException。在任何一种情况下重试都是安全的,但不可能尝试不同的操作(例如 abortTransaction),因为提交可能已经在完成过程中。如果不重试,唯一的选择是关闭生产者。
考虑一个应用程序,其中 Kafka 生产者发送一组记录作为事务 A。
记录成功发送到主题后,Kafka Producer 将执行commitTransaction. Kafka 集群接收提交事务请求并成功提交作为事务 A 一部分的记录。Kafka 集群发送有关成功提交的确认。
然而,由于某些问题,此确认丢失,导致TimeoutKafka 生产者commitTransaction调用出现异常。因此,即使记录已经提交到 Kafka 集群上,从生产者的角度来看,提交还是失败了。
通常在这种情况下,应用程序会在新事务 B 中重试发送事务 A 记录,但这会导致记录重复,因为它们已经作为事务 A 的一部分提交。
上述场景可能吗?您如何处理commitTransaction确认丢失以及由此导致的最终记录重复?
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |