生产者问题
Producer发送消息到队列,分区Leader收到消息后返回ACK给Producer,表示接收成功,此时可以继续发送下一笔消息。
Kafka提供了3种不同级别的ACK机制:
- 0:Leader收到消息后立刻返回给Producer,消息可能还没刷盘,也还没有同步给Follower。此时如果Leader挂掉,消息就丢失了。
- 1:Leader将消息写入磁盘后,立刻返回ACK给Producer,消息可能还没同步Follower。此时如果Leader挂掉,选举新的Follower成为主分区,因为刚才没同步成功,所以消息丢失。
- -1:Leader将消息写入磁盘,并且同步给所有Follower,此时再返回ACK。这个方案也存在一个问题,如果在Leader准备返回ACK的时候挂掉,Producer没收到ACK认定为发送失败。此时又有2种情况
(1)开启重试:会导致队列收到2条重复的消息,此时需要Consumer端保证消费幂等,后面会介绍
(2)不开启重试(
本文分析了Kafka中消息丢失和重复消费的原因,包括生产者ACK机制和消费者Offset提交方式。解决方案包括将ACK设为-1以减少丢失,消费者端通过唯一标识避免重复消费,以及在特定场景下选择性能优先策略接受部分数据丢失。
订阅专栏 解锁全文
161

被折叠的 条评论
为什么被折叠?



