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

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

在这里插入图片描述

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

1. 设置异步发送

在这里插入图片描述

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

2. 设置消息重试机制

在这里插入图片描述

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

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

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

在这里插入图片描述

1. 发送确认机制acks

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

四、小结

在这里插入图片描述

五、模拟面试

在这里插入图片描述

  • 0
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值