生产者丢消息问题
生产者(Producer) 调用send方法发送消息之后,消息可能因为网络问题并没有发送过去。
- 使用
producer.send(msg)
发送数据,这个方法保证不了成功,可以通过get获取发送结果,没有成功,继续发送,这样弄把异步弄成了同步,影响性能 - 使用
producer.send(msg, callback)
,失败了通过回调函数进行发送重试,重试间隔和时间稍微大一些
消费者丢消息问题
消息到partition的时候,会分配一个offset,消费者拉取某个分区的消息后,会自动提交offset,如果这部分消息还没有消费,突然挂掉了,这个时候这部分消息就丢失了
- 改为消息消费完 然后在提交offset,这样不太好的就是消息可能会消费两次,可以通过做幂等来处理。
Kafka本身丢了消息
Kafka中partition分区中存在多个副本,多个副本中,其中有一个是leader副本,其他都是follower。
我们发送的消息发到leader,然后follower副本从leader副本拉数据同步,生产者和消费者只于leader副本交互。其他副本只是存储作用。
假设leader副本的broker挂掉,这个时候从follower副本中选出的leader数据就有可能不全,发生消息丢失
设置acks=all
acks=1是生产者发送的消息被leader副本接收之后就算发送成功
acks=all是生产者发送的消息被所有副本接收之后就算发送成功
replication.factor >= 3
每个partition副本数至少有3个副本
建议设置 replication.factor= min.insync.replicas+1;
设置 min.insync.replicas > 1
代表至少写入两个副本才算是发送成功。
设置 unclean.leader.election.enable = false
leader副本消息同步follower副本过程中,同步情况不一致,设置为false之后,当leader副本发生故障时,就不会从达不到要求的副本中选leader了。