apache-kafka - Kafka commitTransaction 确认失败
问题描述
根据 Kafka 的commitTransaction
文档,如果在特定时间内没有收到响应,commitTransaction
将会失败TimeoutException
请注意,如果在 max.block.ms 到期之前无法提交事务,则此方法将引发 TimeoutException。此外,如果被中断,它将引发 InterruptException。在任何一种情况下重试都是安全的,但不可能尝试不同的操作(例如 abortTransaction),因为提交可能已经在完成中。如果不重试,唯一的选择是关闭生产者。
考虑一个应用程序,其中 Kafka 生产者将一组记录作为事务 A 发送。
记录成功发送到主题后,Kafka 生产者将执行commitTransaction
. Kafka 集群接收到提交事务请求并成功提交作为事务 A 一部分的记录。Kafka 集群发送关于成功提交的确认。
但是,由于某些问题,此确认丢失,导致Timeout
Kafka 生产者commitTransaction
调用异常。因此,即使记录已在 Kafka 集群上提交,但从生产者的角度来看,提交失败了。
通常在这种情况下,应用程序会在新事务 B 中重试发送事务 A 记录,但这会导致记录重复,因为它们已经作为事务 A 的一部分提交。
上述情况可能吗?您如何处理由此导致的commitTransaction
确认丢失和最终重复记录?
解决方案
推荐阅读
- javascript - Angular / Firebase 上传文件错误:“[object Object]”
- javascript - 使用 React-Redux 过滤数组并返回全局状态的对象
- c# - 将 C# 委托和事件代码转换为 VB 的问题
- sql - SQL 文本到分钟
- python - 生物种群增长的 Python 预测
- amazon-web-services - EMR 上 Spark 批处理作业的优化
- c# - 注册表中的 LegacySameSiteCookieBehaviorEnabled=0 对应用程序身份验证过程的影响
- wordpress - 如何控制 Wordpress 从插件注入代码的位置(进入页面)
- r - 我怎样才能用循环填充这个矩阵(然后将其推广到 3D 数组)并使用条件?在 R 中
- python - 如何在功能工具中通过多个 id 创建新变量?