kafka面试题知识点整理

article/2025/9/14 17:56:11

kafka-面试题整理

  • 刚刚学了kafka,整理一些面试题知识点,帮助记忆
    • 1、什么是kafka
    • 2、什么是消息队列
    • 3、kafka通信流程
    • 4、Leader选举流程
    • 5、副本及同步原理
    • 6、消费者消费数据的方式
    • 7、分区分配策略以及原理
    • 8、如何保证消息的可靠性
    • 9、数据有序/乱序
    • 10、幂等性原理
    • 11、为什么kafka放弃zookeeper
    • 12、kafka文件存储机制
    • 13、产生数据积压,如何快速处理
    • 14、硬件估算
    • 15、kafka为什么比较快

刚刚学了kafka,整理一些面试题知识点,帮助记忆

本文是自己学习整理,以及参考其他博客,如有什么错误,欢迎指出,谢谢~~
kafka参数配置官方文档
其他博主博客

1、什么是kafka

  • 传统定义: Kafka是一个分布式的基于发布/订阅模式的消息队列(MQ),主要应用于大数据实时处理领域
  • 最新定义: Kafka是一个开源平台的分布式事件流平台(Event Streaming Platform),大部分公司应用于数据管道流分析数据集成关键任务应用
  • 注:相关概念
    • 注册中心zookeeper(非kafka内部),2.8.0后kafka版本抛弃了zookeeper
    • Producer: 消息生产者,向kafka集群写入数据
    • Consumer: 消息消费者,获取kafka集群数据
    • Consumer Group: 消费者组,由多个consumer组成;消费者组内每个消费者消费不同分区数据,1个分区只能由1个组内的1个消费者消费;消费者之间互不影响;消费者组是逻辑上的一个订阅者
    • Broker: kafka一台服务器就是1个Broker,1个集群由多个broker组成;1个borker中容纳多个topic
    • Topic: 消息主题,将消息进行分类,可以理解为1个队列
    • Partition: 为了实现扩展性,1个topic可以分为多个partition,每个partition都是一个有序队列
    • Replica: 副本,1个topic的每个分区都有若干副本,一个leader和若干follower
    • Leader: 多个分区中有1个为主副本,即leader,生产者和消费者交流数据的对象,其余均为follower
    • Follower: 多个分区除了Leader外的其余副本,会实时从leader中同步数据,保持于leader数据的同步,Leader发生故障市,Follower会选举成为新的Leader,leader不对外服务
    • Coordinator: 协调者,为了消费者组分配分区以及冲平衡Rebalance操作

2、什么是消息队列

目前主流消息队列有Kafka、ActiveMQ、RabbitMQ、RocketMQ; 大数据场景多采用kafka,JavaEE多采用其余三种

1)、应用场景

  • 缓存/削峰: 控制和优化数据流经过系统的速度,解决生产者和消费者消息处理 不一致问题;缓解流量洪峰时服务器压力
  • 解耦: 通过遵循同样的接口约束,允许两边不同系统独立地扩展和修改内部逻辑
  • 异步通信: 允许用户将一个消息放入队列,并不立即进行处理,在需要地时候再去处理

2)、模式

  • 点对点模式: 消费者主动拉取数据,收到后清除消息
  • 发布/订阅模式:
    • 可以有多个topic主题
    • 消费者消费数据后,不删除数据
    • 每个消费者相互独立,都可以消费到数据

3)、kafka通过Consumer Group同时支持两种模式,所有的消费者在一个组内,消息只能被同一个Group内的一个消费者消费,就是点对点模式;如果组内仅有一个消费者,就是发布/订阅模式

3、kafka通信流程

  • 1、kafka集群启动后,通过server.properties配置参数自动注册到zookeeper,再分目录下创建kafka目录,同时订阅zookeeper的brokers/ids路径,保存所有的broker信息
  • 生产者启动通过bootstrap.servers连接到指定的broker上(代码开发过程中bootstrap.servers要使用域名,ip可能连接不上),创建tcp连接
  • 和所有的broker创建连接
  • 然后生产者者开始发送数据到kafak集群
  • 消费者和生产者一样连接上broker
  • 获取到broker的元数据,根据分区Leader节点所在的broker节点,和broker创建连接
  • 开始消费数据

4、Leader选举流程

  • 前提: kafka集群中有1个broker的Controller会被选举为Controller Leader,负责管理集群broker的上下线、所有topic的分区副本和Leader选举工作,Controller的信息同步工作依赖zookeeper
  • 流程: 当不存在Leader或者Leader挂掉了,会按照在ISR中存活为前提,在AR中排在前面的优先的规则进行选取Leader
  • eg: ar:[1,0,2], isr:[1,0,2],那么Leader会按照1,0,2的顺序进行轮询
  • 注:2.8.0以前,Leader信息记录在zk,之后采用kraft版本就不再需要zk,记录在kafka内部

5、副本及同步原理

副本同步是Follower从Leader同步数据,作为冗余灾备使用,不对外,默认1个,生产上基本>=2个,Leader负责对外提供服务。

  • AR: Assigned Replicas,所有副本集合
  • ISR: 和Leader保持同步的副本,默认同步时间(replica.lag.time.max.ms)默认10s,Leader和Follower时差10s内就可以认为是同步
  • LEO(Log End Offset): 下一条待写入消息的位移(见下图)
  • HW(High Watermark): 高水位(复制点),所有副本中最小的LEO(见下图)
    Follower同步Leader副本数据
  • 同步过程:
    • 1、当Leader中没有数据可同步,则Follower阻塞;Leader收到消费者的数据后解除Follower阻塞,Follower开始同步数据;每次发送fetch请求拉取数据。
    • 2、HW计算:当前broker1同步到5,broker2同步到7,HW=min(LEOBroder0,LEOBroder1, LEOBroder2)= 5;
  • Leader故障处理:
    • Leader故障后会从ISR中选出一个新的Leader
    • 为保证多个副本之间数据的一致性,其余的Follower会先将各自log中高于HW的部分截掉,然后从新的Leader同步数据
    • 注:这只能保证副本之间的数据一致性,不保证数据不丢失或者不重复
  • Follower故障处理:
    • 故障的Follower会临时踢出ISR
    • 期间Leader和其他Follower继续接收同步数据
    • 待该Follower恢复后,会读取本地磁盘记录的上次HW,并将log文件高于HW的部分截取掉,从HW开始向Leader进行同步数据
    • 等该LEOFollower>=HWLeader,既追上了Leader,就可以重新加入ISR

6、消费者消费数据的方式

kafka中consumer采用的是poll(拉取)模式,没有采用pull(推送模式),是因为由broker决定消息发送速率很难适应所有的消费者消费速率;poll模式的不足之处在于如果broker中没有数据,消费者会陷入空循环

7、分区分配策略以及原理

  • 4种策略:RangeRoundRobinStickyCooperativeSticky(3.0以后版本)

  • 默认策略: Range + CooperativeSticky,可以通过partition.assignment.strategy参数进行调整,同时可以使用多种策略

  • 再平衡:

    • 每个消费者都会和coordinator保持心跳(默认3s),一旦超时(session.timeout.ms=45s),该消费者就会被移除,触发再平衡;或者消费者处理消息时间过长(max.poll.interval.ms=5mins),也会触发再平衡
    • 一般极力避免再平衡,再平衡过程中会停止对数据的消费,造成数据积压
  • Range:
    Range分区示意图
    如上图所示,range分区尽可能保证分区均匀,通过Countpartitions/Countconsumer来决定每个消费者应该消费几个分区,如果除不尽,排在前面的消费者就会多消费分区

    • 注: 如果只有一个topic,按照上面的场景consumer-0多消费一个没问题,如果是N个topic,并且每一个topic分区和上面一样,那么consumer-0就会多消费N个partition,容易产生数据倾斜
  • RoundRobin:
    RoundRobin分区示意图

    • RoundRobin针对集群种所有的partition和consumer都列出来,然后按照hashcode进行排序,最后通过轮询算法分配partition到各个消费者
  • Sitcky:

    • 顾名思义,粘性分区就是再进行新一次分配前,考虑上一次的分配结果,尽量少的调整分配的变动,可以节省大量的开销
    • 自kafak 0.11.x版本引入,首先会尽量均匀地方式分区到消费者上,再出现同一组消费者组内消费者出现问题的时候,会尽量保持原有分配地分区不变化
  • CooperativeSticky:

    • 合作者粘性保持Sticky的逻辑之外,同时允许合作者再平衡

8、如何保证消息的可靠性

  • 生产者

    • acks应答级别
      • 0: 生产者发送数据到集群后就结束,可靠性差,效率高;生产上基本不使用
      • 1: 生产者发送数据到集群后Leader应答,可靠性中等,效率中等,多用在日志的传输上,允许一定的丢失
      • -1(all): 生产者发送数据到集群后,Leader和ISR队列里面所有的Follower应答,可靠性高,效率低,多用在关键数据、对可靠性要求比较高的场景
    • 消息失败重试
      • retries: 此参数让生产者发送消息失败后不停重试,默认是INT_MAX,如果设置了重试还想保证消息的有序性,需要设置MAX_IN_FLIGHT_REQUESTRS_PER_CONNECTION=1,否则再重试此失败消息的时候,可能有其他消息发送成功了
  • 消费者

    • 关闭自动提交位移,修改业务处理成功手动提交即可使得消息丢失
    • 消费者再平衡的时候,会读取上次提交的偏移量,默认是5s,会导致重复消费或者丢失消息
    • enable.auto.commit=false设置为手动提交
  • 注:数据完全可靠条件: ACK级别设置为-1 + 分区副本>=2 + ISR里应答的最小副本数量>=2

9、数据有序/乱序

  • 生产者发送过来的数据做到单分区内有序,多分区无序
  • 1.x版本之前通过指定max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等性)
  • 1.x版本之后未开启幂等性,需要设置max.in.flight.requests.per.connection=1;开启幂等性后,max.in.flight.requests.per.connection<=5(启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据,无论如何,都可以保证近5个request的数据都是有序的,通过幂等性里面的SeqNumber判断有序)

10、幂等性原理

  • 幂等性: Producer不论向Broker发送多少次重复数据,Broker都只会持久化1条,保证了不重复(仅保证单分区会话内不重复)
  • 精确一次: 幂等性 +至少一次(ACK=-1 + 分区副本数>=2 + ISR最小副本数量>= 2)
  • 重复数据判断标准: 具有<PID,Partition,SeqNumber>相同主键消息提交时,Broker只会持久化一条,PID是kafka进程号,Partition标识分区号,Sequence Number单调自增
  • 开启条件: 通过参数enable.idempotence 开启,默认true

11、为什么kafka放弃zookeeper

  • 从系统运维角度来说kafka本身是一个分布式系统,其自身运维已经十分复杂;同时依赖zookeeper,增加运维成本
  • 对于kafka自身的发展而言,过度依赖外部系统不利于自身功能的完善与维护
  • 在性能方面,offset、isr等信息保存在zookeeper中,zookeeper不适合高频的读写与更新操作,会影响其性能,新版本的kafka已经将提交和保存用消息的方式进行存储
  • zookeeper已经成为kafka的瓶颈

12、kafka文件存储机制

  • 1、Topic是逻辑上的概念,Partition是物理上的概念,每个Partition对应一个log文件(即生产数据)。Partition产生的数据会被追加到log文件末尾(顺序写入)。
  • 2、为了防止log过大导致数据定位效率低下,kafka采用分片索引机制,将每个Partition分割成多个Segement,每个Segement包括“.index”文件,“.log”文件和“.timeindex”等文件,统一位于topic+分区编号目录下
    • 注:index和log文件以当前segement的第一条消息的offset命名
  • 3、Log&Index:
    • index为稀疏索引 ,大约每往log写入4kb数据,往index写入一条索引,参数log.index.interval.bytes默认4kb
    • index文件中保存offset为相对offset,这样确保offset的值占用空间不会过大,因此将offset的值控制在固定大小(真实offset=文件名数据+文件内offset)
  • 4、文件清理策略
    • 清理周期: 默认日志保存时间为7天 ,还可以设置清理间隔为分钟、毫秒,优先级:小时<分钟<毫秒;检查周期默认5mins
    • delete策略:
      • 基于时间:默认打开,以segement中所有记录的最大时间戳作为文件的时间戳
      • 基于大小:默认关闭,超过设置日志总大小,删除最早的segement
    • compat策略:
      • 日志压缩:对相同key的不同value,保留最后一个版本
      • 压缩后offset可能不连续
      • 此策略适合场景:消息key是用户ID,value是用户资料,通过这种策略,保存的用户数据一直是最新数据

13、产生数据积压,如何快速处理

  • 1、增加分区Partitions数,一般不能大于kafka的broker数;如果大于,会出现无法消费数据的情况
  • 2、提高消费者的速度,增大每次拉取的缓冲区数据的最大值(batch.size),或者加大每次拉取的数据条数
  • 3、调整生产者的参数,适当增加缓冲区一批数据的大小(batch.size);增大延迟时间(linger.ms),默认0ms,标识没有延迟,生产环境建议5-100ms; 压缩生产者发送的数据(compression.type),默认none(不压缩),支持压缩类型gzipsnappylz4zstd(压缩比高的压缩时间长,压缩比低的效果不明显)

14、硬件估算

  • 服务器台数=2*(生产者分支生产率 * 副本/100) +1
  • cpu数量:
    • num.io.thread:写磁盘线程,占总核数50%
    • num.replica.fetchers:副本拉取线程数,占总核数50%的1/3
    • num.network.threads:数据传输线程,占总核数50%的2/3

15、kafka为什么比较快

高效读写数据

  • 分布式集群: kafka本身是分布式集群,可采用分区技术,并行度高
  • 稀疏索引: 读数据采用稀疏索引,能够快速定位到要消费的数据
  • 顺序IO: kafka写数据到分区采用追加的方式(顺序写入),所以这个速度非常快;物理上采用磁盘和固态硬盘区别不大;官网数据:顺序读写600M/s,随机只有100K/s
  • 零拷贝和页缓存: kafka在写入消息的时候通过mmap内存映射的方式,上层有写操作的时候,操作系统只将数据写入pageCache,发生读操作时,先从pageCache查找,找不到再去磁盘查找,实际上pageCache尽可能多的将空闲内存作为磁盘缓存使用; kafka的数据加工由生产者和消费者处理,broker应用不关心存储数据,所以数据不走应用层,通过sendfile实现零拷贝,将数据直接发送到consumer
  • 批处理和压缩: kafka在发送和消费消息的时候,是一批一批处理数据;且可对消息进行压缩,缩小消息体积,可以一次性传输更多消息

http://chatgpt.dhexx.cn/article/CoEI8iS2.shtml

相关文章

kafka面试题

1.Kafka数据积压如何处理&#xff1f; 1. 实时/消费任务挂掉导致的消费滞后 a. 任务重新启动后直接消费最新的消息&#xff0c;对于"滞后"的历史数据采用离线程序进行"补漏"。b. 任务启动从上次提交offset处开始消费处理 如果积压的数据量很大&#xff0c…

Kafka 面试题,看这一篇就够了

Kafka 基础 消息系统的作用 大部分小伙伴应该都清楚&#xff0c;这里用机油装箱举个例子&#xff1a; 所以消息系统就是如上图我们所说的仓库&#xff0c;能在中间过程作为缓存&#xff0c;并且实现解耦合的作用。 引入一个场景&#xff0c;我们知道中国移动&#xff0c;中国联…

32 道常见的 Kafka 面试题

最近很多粉丝后台留言问了一些大数据的面试题&#xff0c;其中包括了大量的 Kafka、Spark等相关的问题&#xff0c;所以我特意抽出时间整理了一些大数据相关面试题&#xff0c;本文是 Kafka 面试相关问题&#xff0c;其他系列面试题后面会陆续整理&#xff0c;欢迎关注过往记忆…

Kafka面试题及答案整理 110道 (持续更新)

最新Kafka面试题【附答案解析】Kafka面试题及答案&#xff0c;Kafka最新面试题及答案&#xff0c;Kafka面试题新答案已经全部更新完了&#xff0c;有些答案是自己总结的&#xff0c;也有些答案是在网上搜集整理的。这些答案难免会存在一些错误&#xff0c;仅供大家参考。如果发…

2022 最新 Kafka 面试题

Kafka 面试题 1、如何获取 topic 主题的列表2、生产者和消费者的命令行是什么&#xff1f;3、consumer 是推还是拉&#xff1f;4、讲讲 kafka 维护消费状态跟踪的方法5、讲一下主从同步\6、为什么需要消息系统&#xff0c;mysql 不能满足需求吗&#xff1f;1.解耦&#xff1a;2…

20道常见的kafka面试题以及答案

JAVA面试宝典&#xff0c;搞定JAVA面试&#xff0c;不再是难题&#xff0c;系列文章传送地址&#xff0c;请点击本链接。 目录 1、kafka的消费者是pull(拉)还是push(推)模式&#xff0c;这种模式有什么好处&#xff1f; 2、kafka维护消息状态的跟踪方法 3、zookeeper对于ka…

VS2017安装打包插件

1、打开VS2017&#xff1a;工具-》》扩展和更新-》》 2、搜索Microsoft Visual Studio 2017 Installer Projects 3、点击下载&#xff0c;下载完成 4、按照提示&#xff0c;关闭所有VS后&#xff0c;自动安装 5、选择修改 6、安装完成

VS2017安装CLR

打开Visual Studio Community 2017&#xff0c;选择更改&#xff0c;然后在右侧安装详细信息将C/CLI支持打上勾&#xff0c;然后更新就可以了。 在VS里面新建项目就可以看见已经有CLR了。

VS2017安装成功后,无MFC选项解决办法

在安装VS2017时&#xff0c;勾选了安装MFC工作负载&#xff0c;但是新建项目时没有MFC选项。解决办法如下&#xff1a; 首先打开VS INSTALLER&#xff0c;点击修改 发现已经勾选MFC工作负载&#xff0c;点击右侧“安装详细信息”栏中的“使用C的桌面开发” 勾选“用于X86和X6…

vs2017安装勾选哪些_vs2017安装以编写c语言

安装这两个插件就行了 创建第一个项目 注意&#xff1a;C 是在 C 语言的基础上进行的扩展&#xff0c;所有在本质上&#xff0c;C 已经包含了 C 语言的所有内容&#xff0c;所以大部分 IDE 会默认创建后缀名为 .cpp 的C 源文件。为了大家养成良好的规范&#xff0c;写 C 语言代…

VS2017安装qt插件失败(已解决)

VS2017安装qt插件失败(已解决&#xff09; 试过很多方法没有解决此问题&#xff0c;偶然间删除一个文件夹&#xff0c;重新安装就成功了。 解决方法&#xff1a;删除红色框中的文件夹即可。&#xff08;该文件路径在C盘的用户文件夹中查找&#xff0c;勾选隐藏的项目即可看到隐…

vs2017 安装Qt VS Tools ,新建项目没有Qt GUI Application选项 ,解决方法

一、查看测试栏有没有该选项 二、如果也没有&#xff0c;就是Qt GUI Application版本太高 1、已知Qt VS Tools 2.4.0和Qt VS Tools 2.1.2是有的&#xff0c; 分享一个Qt VS Tools 2.1.2 链接&#xff1a;https://pan.baidu.com/s/18AmBnxQHqmVspsPlQmbPBw 提取码&#xff1a;1…

VS2017安装插件SVN

材料 VS安装程序。VisualSVN安装程序。 前期准备 在代码管理的服务器上安装SVN server。 在本机安装TortoiseSVN&#xff08;也就是SVN的客户端&#xff0c;可在文件库中查看代码以及文档&#xff09;。 Visual Studio安装SVN插件 安装VisualSVN&#xff0c;按照软件提示一…

C#开发环境配置-VS2017安装与卸载

安装 双击安装.exe(必须保证联网) 这三项要勾选 安装完成启动程序&#xff0c;需要登陆账户邮箱密码&#xff0c;不登陆也可以使用30天。 VS2017设置起始页 vs2017将打开起始页放到了文件菜单下&#xff1a;文件》起始页 将程序快捷方式放在桌面是紫色的图标&am…

VS2017安装(在线、离线)

VS2017安装&#xff08;离线版&#xff09; ------------------------------------------------------------------------------------- 此百度云链接有博客提及的所有东西哦&#xff01;&#xff01;&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1zKcdSQxUetYjs3roi…

vs2017安装libjpeg库

导语 libjpeg对jpeg的功能实在是太强大了&#xff0c;下面简单介绍一下怎么在VS2017下安装使用。看了其他好兄弟们的攻略&#xff0c;把自己踩的坑总结一哈。 下载 http://www.ijg.org/ windows平台选择zip即可 编译 我们是在windows平台下&#xff0c;所以要么使用cmake要…

Qt5.11.1 + VS2017 安装 详细过程

一.安装VS2017 1.安装windows10 SDK 到此网址下载windows10 SDK: https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&rel15# 安装windows10 SDK 2.安装VS2017 到此下载VS2017: https://developer.microsoft.com/z…

如何为vs2017安装svn

方法一 打开vs-工具-扩展和更新-搜索svn 选择 VisualSVN for Visual Studio 2017 点击安装即可 安装后重启vs 方法二 安装vs后&#xff0c;去官网下载VisualSVN-VS2017-6.7.3.vsix&#xff08;点击可跳转官网&#xff09; 安装后重启vs

vs2017安装qt插件及安装qt插件后的设置

vs2017安装qt插件 引言涉及内容一、vs2017安装qt插件的过程二、安装qt插件成功后的设置三、创建第一个关于qt的程序四、设置属性后代码可以查看 引言 安装vs2017后需要在vs2017中安装qt插件&#xff0c;这样可以直接在vs2017中开发qt的项目&#xff0c;这里记录一下。 涉及内…

解决VS2017安装一直卡在正在下载

最近&#xff0c;很多同学在安装VS2017的时候是不是遇到以下情况呢&#xff1f; 一直卡住不动呢&#xff1f;一直在提取,很恼火 直接看视频跟着老师安装吧&#xff01; https://edu.csdn.net/course/detail/8641