一、kafka是如何保证消息不丢失
1. 介绍
- 使用kafka在消息的收发过程都有可能会出现消息丢失
(1)生产者发送消息到broker丢失
(2)消息在broker中存储丢失
(3)消费者从broker接收消息丢失
2. 生产者发送消息到broker丢失
- 设置异步发送:同步发送会发生阻塞,一般使用异步发送方式发送消息
- 消息重试:由于网络抖动,造成消息发送失败,可以使用kafka提供的重试机制
3. 消息在broker中存储丢失
- broker存储大体流程
(1)生产者发送消息到达broker中
(2)消息存储在分区中,分区分为两个不同角色,leader只有一个,follower可能会有多个
(3)先把消息保存到leader分区中,然后由leader将消息同步到follower中
- 发送确认机制acks
(1)要想保证数据不丢失,可以设置acks=all,在所有分区副本保存完成后,才会发送确认给生产者,性能也是最低的
(2)实际生产环境中,最低也要设置acks=1
4. 消费者从broker接收消息丢失
- 一个kafka集群是由多个broker(kafka实例)组成的
- 每一个broker中都存在不同的topic,并且一个topic可能存在多个分区,这些分区可能存在不同的broker中
- 一个消费者组可能存在多个消费者,它们都是消费同一个topic,负责消费topic不同分区
- topic分区中消息只能由消费者组中唯一一个消费者处理,不同的分区分配给不同的消费者
- 丢失消息原因
(1)消费者默认是自动按期提交已经消费的偏移量,默认是每隔5秒提交一次。如果消费者组出现重平衡的情况,可能会重复消费或者丢失消息
(2)可以禁用自动提交偏移量,改为手动
- 解决方案
(1)同步提交【会阻塞,不推荐】
(2)异步提交【偏移量可能不准确,不推荐】
(3)同步+异步组合提交【推荐】
5. 总结
6. 参考答案
二、kafka是如何保证消息的顺序性
1. 介绍
- 问题原因
(1)一个topic中的数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储偏移量,如果消费者关联了多个分区,则不能保证消费的顺序性 - 解决方案
(1)发送消息时,指定分区号,往同一个分区中存储消息
(2)发送消息时,按照相同的业务设置相同的key
2. 案例分析
- springboot集成kafkatemplate
3. 参考答案
三、kafka的高可用机制要了解过吗
1. 介绍
- 集群模式
- 分区备份机制
2. 集群模式
3. 分区备份机制
4. 总结
5. 参考答案
四、kafka数据清理机制有了解过吗
1. 介绍
- kafka文件存储机制
- 数据清理机制