【Kafka面试】Kafka如何保证消息不丢失?

使用Kafka时,在消息的收发过程中都有可能会出现消息丢失。

【Kafka面试】Kafka如何保证消息不丢失?_第1张图片

一、生产者发送消息到broker过程中丢失

1. 设置异步发送

【Kafka面试】Kafka如何保证消息不丢失?_第2张图片

  • 同步发送:会产生阻塞,一般使用异步发送。
  • 异步发送:实现回调方法,消息发送失败时记录日志,或者重新发送,最终确保消息能够成功发送。

2. 设置消息重试机制

在这里插入图片描述

  • 由于网络抖动问题,很快就会恢复正常,造成的消息丢失。

二、消息在broker中存储过程中丢失

Kafka中提供了一种发送确认机制,当生产者发送的消息到broker中,这些消息会存储在分区中。分区又分为leader和follower两种副本角色,其中,leader只有1个,follower可能有多个。分区收到消息后,首先保存到leader副本中,然后由leader副本把数据同步到follower副本中。

【Kafka面试】Kafka如何保证消息不丢失?_第3张图片

1. 发送确认机制acks

【Kafka面试】Kafka如何保证消息不丢失?_第4张图片

  • acks=all:在所有的分区副本保存之后,才会发送确认,可以保证消息不丢失;这也是性能最低的一种。
  • 在实际的生产环境中,最低也要设置acks=1,起码能让leader副本保存数据。

三、消费者从broker接收消息过程中丢失

一个Kafka集群是由多个broker(Kafka实例)组成,在每一个broker中存在不同的topic,且
1个topic可能存在多个分区(partition),分区也可能存在不同的broker中。

【Kafka面试】Kafka如何保证消息不丢失?_第5张图片

  • 1个消费者组中可能存在多个消费者,它们都是消费同一个topic,每个消费者会去消费该topic下不同分区中消息。
  • 每个分区都是按照偏移量(offset)来存储数据的,每个分区都是有顺序的、不可变的消息队列,且可以持续的添加消息。
  • 分区中的消息都配备了一个序列号,称之为偏移量
  • 同一个topic是由不同的消费者组去消费数据的,消费者去消费数据时也会按照偏移量去消费。

【Kafka面试】Kafka如何保证消息不丢失?_第6张图片

  • 默认情况下,每个消费者每个5秒自动提交一次消费偏移量
  • 如果消费者组出现重平衡情况,可能会重复消费或者消息丢失
  • 重平衡:消费者组中某个消费者宕机,其负责消费的分区,交给组内其他消费者,重新分配消费分区过程中可能会出现重复消费或者消息丢失。
  • 重复消费:某个消费者宕机时,当前消费偏移量是3,提交到Kafka的偏移量是1,导致重平衡后组内消费者重复消费某些数据。
  • 消息丢失:某个消费者宕机时,当前消费偏移量是1,提交到Kafka的偏移量是3,导致重平衡后组内消费者重复消费某些数据。

1. 禁用自动提交偏移量,改为手动

导致这个原因就是消费者自动提交偏移量,提交的偏移量不准确,造成重复消费或者消息丢失。可以设置手动提交偏移量,消费多少就提交多少偏移量,如果宕机就不提交偏移量,这样偏移量就准确了。

【Kafka面试】Kafka如何保证消息不丢失?_第7张图片

  • 同步提交:会阻塞
  • 异步提交:如果消费失败,可能导致消费偏移量不准确
  • 同步+异步组合提交:最佳方式

四、小结

【Kafka面试】Kafka如何保证消息不丢失?_第8张图片

五、模拟面试

【Kafka面试】Kafka如何保证消息不丢失?_第9张图片

你可能感兴趣的:(Kafka,kafka)