一、介绍
kafka作为消息队列,一定会有消息丢失和消息重复的问题,那什么场景下会出现这种情况呢?
kafka有一个参数叫做acks
。
当生产者向leader发送消息后,会返回一个确认的消息给生产者。
但是什么时候leader会发送确认消息返回给生产者呢?就是通过acks这个参数决定的,这个参数有三种情况0
、1
、-1
0:就是不用leader发送确认消息,生产者直接发送消息数据给leader。这种情况就会容易发送消息丢失。
1:就是leader不用等所有的follower同步后才发送确认消息后,生产者才发送消息数据给leader。这种情况比上一种可靠一点。
-1:就是leader必须等所有的follower同步完成后才能发送确认消息给生产者,这个时候生产者才会发送消息数据。
二、消息丢失
acks参数设置为1的时候。
当leader接收到生产者发送过来的消息时,不需要等待follower同步,返回确认消息,生产者发送消息HelloA,leader接收到到消息,并没有同步follower,这个时候leader挂掉了,follower选举出新的leader,这个时候因为已经接收到确认消息,所以不会再发送HelloA,会发送下一条消息HelloB,这样我们就丢失了HelloA这条消息。
三、消息重复
acks参数设置为-1的时候。当leader接收到生产者发送过来的消息HelloA时,则等待follower同步,才能返回确认消息,但是这个时候leader挂掉了,follower选举出新的leader,没有发送确认消息给生产者,所以生产者还会发送HelloA这条消息,但是HelloA已经同步到所有的follower了,这样就发生了消息重复的情况了。