生产者问题
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)不开启重试(不推荐):网络问题、超时等原因导致发送失败,不会重新发送,消息容易丢失
消费者问题
Consumer进行消费时,提交Offset偏移给Kafka记录消费的最新位置。 提交Offset有以下2种方式:
- 自动提