在评估腾讯云 CKafka 消费端的实现方案,想确认分区内并发处理和再均衡同时发生时的安全边界。以下是设计推演,不是已经复现的线上故障,目前没有报错原文。 计划环境:Java KafkaConsumer、enable.auto.commit=false、同一消费组内多个实例,消费线程负责 poll 和提交位点,工作线程将事件写入 MySQL 8.0。每条事件有唯一 event_id,去重记录与业务更新放在同一个数据库事务里。业务允许同一分区的不同实体并行,但不能漏处理消息。 已尝试在设计层面对比两种办法:按工作线程已完成的最大 offset 提交,以及仅提交分区内连续完成区间的下一位点。假设一次 poll 获取 offset 100、101、102,101 和 102 的数据库事务先提交,100 仍未完成,此时提交 103 显然会跳过未完成消息,因此倾向于后一种办法。 仍未确定的是再均衡边界:100 的数据库事务可能在分区被撤销后才结束,新消费者此时可能已经接管同一分区。event_id 唯一键能够处理同一事件重放,但对于同一实体的不同事件,旧实例迟到的更新是否仍可能覆盖新实例结果?只在内存里丢弃旧任务的完成回调,似乎不能阻止已经发往数据库的更新。 想请教三个具体问题: 1. 连续完成水位与分区分配代次应如何一起维护,才能防止上一次分配的工作线程回调污染重新分配后的提交位点? 2. 分区撤销时应该等待在途事务结束,还是让它们继续并使用数据库版本条件或 fencing token 拒绝过期写入?如果采用后者,token 应如何原子地产生并在业务更新中校验? 3. 验收时,如何构造“旧实例事务延迟提交、新实例已接管、位点提交失败”的组合场景,并分别证明无漏处理和无过期覆盖,而不只是观察没有重复记录?
相似问题