已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我负责一条结算对账链路,Kafka 3.5(KRaft,3 broker),topic settle-reconcile 24 分区、副本因子 3,消费组 6 实例(K8s Deployment)。消费端走 transactional consumer:
// 简化伪代码
ConsumerFactory<String, String> consumerFactory = new KafkaClientFactory();
KafkaConsumer<String, String> consumer = consumerFactory.createConsumer();
consumer.subscribe(Collections.singletonList("settle-reconcile"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));
for (ConsumerRecord<String, String> record : records) {
try {
// 处理消息
// 假设处理逻辑中发生异常
throw new RuntimeException("模拟处理异常");
} catch (Exception e) {
// 异常处理
// 事务回滚
consumer.abortTransaction();
}
}
}
检查 Kafka 配置:
enable.idempotence = true(开启 idempotent 生产者)enable.auto.commit = false(关闭自动提交)max.poll.interval.ms = 300000(设置较长时间的 poll interval)检查消费者逻辑:
abortTransaction(),但未做任何补偿机制;监控 Kafka 日志:
LSO 在 offset 冲突时的行为:
如何避免此类冲突?
是否有最佳实践或官方文档说明?