【Java面试丨消息中间件】Kafka

一、kafka是如何保证消息不丢失

1. 介绍

  • 使用kafka在消息的收发过程都有可能会出现消息丢失
    (1)生产者发送消息到broker丢失
    (2)消息在broker中存储丢失
    (3)消费者从broker接收消息丢失
    【Java面试丨消息中间件】Kafka_第1张图片

2. 生产者发送消息到broker丢失

  • 设置异步发送:同步发送会发生阻塞,一般使用异步发送方式发送消息
    【Java面试丨消息中间件】Kafka_第2张图片
  • 消息重试:由于网络抖动,造成消息发送失败,可以使用kafka提供的重试机制
    在这里插入图片描述

3. 消息在broker中存储丢失

  • broker存储大体流程
    (1)生产者发送消息到达broker中
    (2)消息存储在分区中,分区分为两个不同角色,leader只有一个,follower可能会有多个
    (3)先把消息保存到leader分区中,然后由leader将消息同步到follower中
    【Java面试丨消息中间件】Kafka_第3张图片
  • 发送确认机制acks
    (1)要想保证数据不丢失,可以设置acks=all,在所有分区副本保存完成后,才会发送确认给生产者,性能也是最低的
    (2)实际生产环境中,最低也要设置acks=1
    【Java面试丨消息中间件】Kafka_第4张图片

4. 消费者从broker接收消息丢失

  • 一个kafka集群是由多个broker(kafka实例)组成的
  • 每一个broker中都存在不同的topic,并且一个topic可能存在多个分区,这些分区可能存在不同的broker中
  • 一个消费者组可能存在多个消费者,它们都是消费同一个topic,负责消费topic不同分区
  • topic分区中消息只能由消费者组中唯一一个消费者处理,不同的分区分配给不同的消费者
    【Java面试丨消息中间件】Kafka_第5张图片
  • 丢失消息原因
    (1)消费者默认是自动按期提交已经消费的偏移量,默认是每隔5秒提交一次。如果消费者组出现重平衡的情况,可能会重复消费或者丢失消息
    (2)可以禁用自动提交偏移量,改为手动
    【Java面试丨消息中间件】Kafka_第6张图片
  • 解决方案
    (1)同步提交【会阻塞,不推荐】
    (2)异步提交【偏移量可能不准确,不推荐】
    (3)同步+异步组合提交【推荐】
    【Java面试丨消息中间件】Kafka_第7张图片

5. 总结

【Java面试丨消息中间件】Kafka_第8张图片

6. 参考答案

【Java面试丨消息中间件】Kafka_第9张图片

二、kafka是如何保证消息的顺序性

1. 介绍

  • 问题原因
    (1)一个topic中的数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储偏移量,如果消费者关联了多个分区,则不能保证消费的顺序性
  • 解决方案
    (1)发送消息时,指定分区号,往同一个分区中存储消息
    (2)发送消息时,按照相同的业务设置相同的key
    【Java面试丨消息中间件】Kafka_第10张图片

2. 案例分析

  • springboot集成kafkatemplate
    在这里插入图片描述

3. 参考答案

【Java面试丨消息中间件】Kafka_第11张图片

三、kafka的高可用机制要了解过吗

1. 介绍

  • 集群模式
  • 分区备份机制

2. 集群模式

【Java面试丨消息中间件】Kafka_第12张图片

3. 分区备份机制

【Java面试丨消息中间件】Kafka_第13张图片
【Java面试丨消息中间件】Kafka_第14张图片

4. 总结

【Java面试丨消息中间件】Kafka_第15张图片

5. 参考答案

【Java面试丨消息中间件】Kafka_第16张图片

四、kafka数据清理机制有了解过吗

1. 介绍

  • kafka文件存储机制
  • 数据清理机制

2. kafka文件存储机制

【Java面试丨消息中间件】Kafka_第17张图片

3. 数据清理机制

【Java面试丨消息中间件】Kafka_第18张图片

4. 总结

【Java面试丨消息中间件】Kafka_第19张图片

5. 参考答案

【Java面试丨消息中间件】Kafka_第20张图片

五、kafka中实现高性能的设计有了解过吗

1. 介绍

【Java面试丨消息中间件】Kafka_第21张图片

2. 参考答案

【Java面试丨消息中间件】Kafka_第22张图片

你可能感兴趣的:(Java面试,java,面试,kafka)