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

一、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. 案例分析

3. 参考答案

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

1. 介绍

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

2. 集群模式

3. 分区备份机制


4. 总结

5. 参考答案

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

1. 介绍

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

2. kafka文件存储机制

3. 数据清理机制

4. 总结

5. 参考答案

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

1. 介绍

2. 参考答案

相关推荐
roman_日积跬步-终至千里2 分钟前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
空空kkk2 分钟前
SSM项目练习——hami音乐(三)
java·数据库
爬山算法11 分钟前
Hibernate(78)如何在GraphQL服务中使用Hibernate?
java·hibernate·graphql
独断万古他化16 分钟前
【Spring 核心:AOP】基础到深入:思想、实现方式、切点表达式与自定义注解全梳理
java·spring·spring aop·aop·切面编程
试着17 分钟前
【huawei】机试
华为·面试·机试·手搓代码
编程彩机28 分钟前
互联网大厂Java面试:从分布式事务到微服务优化的技术场景解读
java·spring boot·redis·微服务·面试·kafka·分布式事务
bbq粉刷匠29 分钟前
Java-排序2
java·数据结构·排序算法
编程彩机31 分钟前
互联网大厂Java面试:从Spring WebFlux到分布式事务的技术场景解析
java·微服务·面试·分布式事务·spring webflux
Jm_洋洋37 分钟前
【C++进阶】虚函数、虚表与虚指针:多态底层机制剖析
java·开发语言·c++
小马爱打代码39 分钟前
MyBatis:缓存体系设计与避坑大全
java·缓存·mybatis