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

20道常见的kafka面试题以及答案1 kafka 的消费者是 pull 拉 还是 push 推 模式 这种模式有什么好处 2 kafka 维护消息状态的跟踪方法 3 zookeeper 对于 kafka 的作用是什么 4 kafka 判断一个节点还活着的有那两个条件 5 讲一讲 kafka 的 ack 的三种机制 6 kafka 分布式 不是单机 的情况下 如何保证消息的顺序消费 7 kafka 如何不消费重复数据 比如扣款 我们不能重复的扣 8 讲一下 kafka 集群的组成 9

JAVA面试宝典,搞定JAVA面试,不再是难题,系列文章传送地址,请点击本链接。

目录

1、kafka的消费者是pull(拉)还是push(推)模式,这种模式有什么好处?

2、kafka维护消息状态的跟踪方法

3、zookeeper对于kafka的作用是什么?

4、kafka判断一个节点还活着的有那两个条件?

5、讲一讲 kafka 的 ack 的三种机制

6、kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

7、kafka 如何不消费重复数据?比如扣款,我们不能重复的扣。

8、讲一下kafka集群的组成?

9、kafka是什么?

10、partition的数据文件(offffset,MessageSize,data)

11、kafka如何实现数据的高效读取?(顺序读写、分段命令、二分查找)

12、 Kafka 消费者端的 Rebalance 操作什么时候发生?

13、Kafka 中的ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?

14、Kafka 中的HW、LEO等分别代表什么?

15、Kafka的那些设计让它有如此高的性能?

16、Kafka为什么不支持读写分离?

17、分区Leader选举策略有几种?

18、请简述下你在哪些场景下会选择 Kafka?

19、请谈一谈 Kafka 数据一致性原理

20、Kafka 缺点?



1kafka的消费者是pull()还是push()模式,这种模式有什么好处?

Kafka 遵循了一种大部分消息系统共同的传统的设计:producer 将消息推送到 broker,consumer 从broker 拉取消息。

优点:pull模式消费者自主决定是否批量从broker拉取数据,而push模式在无法知道消费者消费能力情况下,不易控制推送速度,太快可能造成消费者奔溃,太慢又可能造成浪费。

缺点:如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询,直到新消息到到达。为了避免这点,Kafka 有个参数可以让 consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发送)。

2kafka维护消息状态的跟踪方法

Kafka中的Topic 被分成了若干分区,每个分区在同一时间只被一个 consumer 消费。然后再通过offset进行消息位置标记,通过位置偏移来跟踪消费状态。相比其他一些消息队列使用“一个消息被分发到consumer 后 broker 就马上进行标记或者等待 customer 的通知后进行标记”的优点是,避免了通信消息发送后,可能出现的程序奔溃而出现消息丢失或者重复消费的情况。同时也无需维护消息的状态,不用加锁,提高了吞吐量。

3zookeeper对于kafka的作用是什么?

Zookeeper 主要用于在集群中不同节点之间进行通信,在 Kafka 中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取,除此之外,它还执行其他活动,如: leader 检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。

4kafka判断一个节点还活着的有那两个条件?

5、讲一讲 kafka ack 的三种机制

6kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

Kafka 中发送 1 条消息的时候,可以指定(topic, partition, key) 3 个参数,partiton 和 key 是可选的。

Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织,所以可以保证FIFO 的顺序。不同 partition 之间不能保证顺序。因此你可以指定 partition,将相应的消息发往同 1个 partition,并且在消费端,Kafka 保证1 个 partition 只能被1 个 consumer 消费,就可以实现这些消息的顺序消费。

另外,你也可以指定 key(比如 order id),具有同 1 个 key 的所有消息,会发往同 1 个partition,那这样也实现了消息的顺序消息。

7kafka 如何不消费重复数据?比如扣款,我们不能重复的扣。

这个问题换种问法,就是kafka如何保证消息的幂等性。对于消息队列来说,出现重复消息的概率还是挺大的,不能完全依赖消息队列,而是应该在业务层进行数据的一致性幂等校验。

比如你处理的数据要写库(mysql,redis等),你先根据主键查一下,如果这数据都有了,你就别插入了,进行一些消息登记或者update等其他操作。另外,数据库层面也可以设置唯一健,确保数据不要重复插入等 。一般这里要求生产者在发送消息的时候,携带全局的唯一id。

8、讲一下kafka集群的组成?

kafka的集群图如下:

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

Broker(代理)

Kafka集群通常由多个代理组成以保持负载平衡。 Kafka代理是无状态的,所以他们使用ZooKeeper来维护它们的集群状态。 一个Kafka代理实例可以每秒处理数十万次读取和写入,每个Broker可以处理TB的消息,而没有性能影响。 Kafka经纪人领导选举可以由ZooKeeper完成。

ZooKeeper

ZooKeeper用于管理和协调Kafka代理。 ZooKeeper服务主要用于通知生产者和消费者Kafka系统中存在任何新代理或Kafka系统中代理失败。 根据Zookeeper接收到关于代理的存在或失败的通知,然后生产者和消费者采取决定并开始与某些其他代理协调他们的任务。

Producers(生产者)

生产者将数据推送给经纪人。 当新代理启动时,所有生产者搜索它并自动向该新代理发送消息。 Kafka生产者不等待来自代理的确认,并且发送消息的速度与代理可以处理的一样快。

Consumers(消费者)

因为Kafka代理是无状态的,这意味着消费者必须通过使用分区偏移来维护已经消耗了多少消息。 如果消费者确认特定的消息偏移,则意味着消费者已经消费了所有先前的消息。 消费者向代理发出异步拉取请求,以具有准备好消耗的字节缓冲区。 消费者可以简单地通过提供偏移值来快退或跳到分区中的任何点。 消费者偏移值由ZooKeeper通知。

9kafka是什么?

Kafka是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由LinkedIn公司开发,使用Scala语言编写,目前是Apache的开源项目。

broker: Kafka服务器,负责消息存储和转发

topic:消息类别,Kafka按照topic来分类消息

partition: topic的分区,一个topic可以包含多个partition, topic 消息保存在各个partition上4. offset:消息在日志中的位置,可以理解是消息在partition上的偏移量,也是代表该消息的唯一序号

Producer:消息生产者

Consumer:消息消费者

Consumer Group:消费者分组,每个Consumer必须属于一个group

Zookeeper:保存着集群 broker、 topic、 partition等meta 数据;另外,还负责broker故障发现, partition leader选举,负载均衡等功能

10partition的数据文件(offffsetMessageSizedata

partition中的每条Message包含了以下三个属性: offset,MessageSize,data,其中offset表示Message在这个partition中的偏移量,offset不是该Message在partition数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了partition中的一条Message,可以认为offset是partition中Message的 id; MessageSize表示消息内容data的大小;data为Message的具体内容。

11kafka如何实现数据的高效读取?(顺序读写、分段命令、二分查找)

Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为index。 index文件中并没有为数据文件中的每条Message建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中。

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

12 Kafka 消费者端的 Rebalance 操作什么时候发生?

  • 同一个 consumer 消费者组 group.id 中,新增了消费者进来,会执行 Rebalance 操作
  • 消费者离开当期所属的 consumer group组。比如宕机
  • 分区数量发生变化时(即 topic 的分区数量发生变化时)
  • 消费者主动取消订阅

Rebalance的过程如下:

第一步:所有成员都向coordinator发送请求,请求入组。一旦所有成员都发送了请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader。

第二步:leader开始分配消费方案,指明具体哪个consumer负责消费哪些topic的哪些partition。一旦完成分配,leader会将这个方案发给coordinator。coordinator接收到分配方案之后会把方案发给各个consumer,这样组内的所有成员就都知道自己应该消费哪些分区了。

所以对于Rebalance来说,Coordinator起着至关重要的作用

13Kafka 中的ISR(InSyncRepli)OSR(OutSyncRepli)AR(AllRepli)代表什么?

答:kafka中与leader副本保持一定同步程度的副本(包括leader)组成ISR。与leader滞后太多的副本组成OSR。分区中所有的副本通称为AR。

14Kafka 中的HWLEO等分别代表什么?

答:HW:高水位,指消费者只能拉取到这个offset之前的数据

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

LEO:标识当前日志文件中下一条待写入的消息的offset,大小等于当前日志文件最后一条消息的offset+1.

15Kafka的那些设计让它有如此高的性能?

16Kafka为什么不支持读写分离?

1、 这其实是分布式场景下的通用问题,因为我们知道CAP理论下,我们只能保证C(一致性)和A(可用性)取其一,如果支持读写分离,那其实对于一致性的要求可能就会有一定折扣,因为通常的场景下,副本之间都是通过同步来实现副本数据一致的,那同步过程中肯定会有时间的消耗,如果支持了读写分离,就意味着可能的数据不一致,或数据滞后。

2、 Leader/Follower模型并没有规定Follower副本不可以对外提供读服务。很多框架都是允许这么做的,只是 Kafka最初为了避免不一致性的问题,而采用了让Leader统一提供服务的方式。

3、 不过,自Kafka 2.4之后,Kafka提供了有限度的读写分离,也就是说,Follower副本能够对外提供读服务。

17、分区Leader选举策略有几种?

分区的Leader副本选举对用户是完全透明的,它是由Controller独立完成的。你需要回答的是,在哪些场景下,需要执行分区Leader选举。每一种场景对应于一种选举策略。

1、 OfflinePartition Leader选举:每当有分区上线时,就需要执行Leader选举。所谓的分区上线,可能是创建了新分区,也可能是之前的下线分区重新上线。这是最常见的分区Leader选举场景。

2、 ReassignPartition Leader选举:当你手动运行Kafka-reassign-partitions命令,或者是调用Admin的alterPartitionReassignments方法执行分区副本重分配时,可能触发此类选举。假设原来的AR是[1,2,3],Leader是1,当执行副本重分配后,副本集合AR被设置成[4,5,6],显然,Leader必须要变更,此时会发生Reassign Partition Leader选举。

3、 PreferredReplicaPartition Leader选举:当你手动运行Kafka-preferred-replica-election命令,或自动触发了Preferred Leader选举时,该类策略被激活。所谓的Preferred Leader,指的是AR中的第一个副本。比如AR是[3,2,1],那么,Preferred Leader就是3。

4、 ControlledShutdownPartition Leader选举:当Broker正常关闭时,该Broker上的所有Leader副本都会下线,因此,需要为受影响的分区执行相应的Leader选举。

这4类选举策略的大致思想是类似的,即从AR中挑选首个在ISR中的副本,作为新Leader。

18、请简述下你在哪些场景下会选择 Kafka

19、请谈一谈 Kafka 数据一致性原理

一致性就是说不论是老的 Leader 还是新选举的 Leader,Consumer 都能读到一样的数据。

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

这样做的原因是还没有被足够多副本复制的消息被认为是“不安全”的,如果 Leader 发生崩溃,另一个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏一致性。试想,一个消费者从当前 Leader(副本0) 读取并处理了 Message4,这个时候 Leader 挂掉了,选举了副本1为新的 Leader,这时候另一个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不一致性问题。

当然,引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms 参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。

20Kafka 缺点?

JAVA面试宝典,搞定JAVA面试,不再是难题,系列文章传送地址,请点击本链接。20道常见的kafka面试题以及答案https://blog.csdn.net/wanghaiping1993/article/details/125075785

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221972.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:51
下一篇 2026年3月17日 下午4:52


相关推荐

  • tensorflow各个版本的CUDA以及Cudnn版本对应关系

    tensorflow各个版本的CUDA以及Cudnn版本对应关系概述,需要注意以下几个问题:(1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的本质是一个工具包(ToolKit);但是二者虽然不一样的。显卡驱动的安装:当我们使用…

    2022年6月9日
    29
  • 【蚁剑工具-01】网站管理工具之中国蚁剑安装过程详解以及应用实例

    【蚁剑工具-01】网站管理工具之中国蚁剑安装过程详解以及应用实例目录 1 中国蚁剑安装及设置 1 1 下载 1 2 安装 1 3 相关设置 2 中国蚁剑应用实例 2 1 操作环境 2 2 具体步骤 2 3 思考 3 总结参考文章任何人不得将其用于非法用途以及盈利等目的 也禁止未经允许私自修改打包进行发布 否则后果自行承担并将追究其相关责任 中国蚁剑是一款开源的跨平台网站管理工具 它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员 1 中国蚁剑安装及设置安装位置 win10 真实机 1 1 下载 1 下载蚁剑加载器 在蚁剑官方 github 下载 网址为 https

    2026年3月17日
    1
  • 轻算力也能玩大模型,V821成功对接DeepSeek和豆包视觉大模型

    轻算力也能玩大模型,V821成功对接DeepSeek和豆包视觉大模型

    2026年3月12日
    2
  • Python变量名详细规则介绍———超详细变量值

    Python变量名详细规则介绍———超详细变量值Python 需要使用标识符给变量命名 其实标识符就是用于给程序中变量 类 方法命名的符号 简单来说 标识符就是合法的名称标识符需要以字母或下划线 开头 可以和字母 数字 下划线进行搭配使用 字母不局限与 26 个英文字母 其中可以包括中文字符日文字符等等由于 Python3 也支持 UTF 8 字符集 因此 Python3 的标识符可以使用 UTF 8 所能表示的多种语言的字符 Python 语言是区分大小写的 因此 abc 和 Abc 是两个不同的标识符 Python2 x 对中文支持较差 如

    2026年3月18日
    2
  • springboot和传统springmvc区别「建议收藏」

    springboot和传统springmvc区别「建议收藏」一、概念1、SpringSpring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。2、SpringMVCSpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校

    2022年8月20日
    7
  • 排序算法:堆排序

    排序算法:堆排序

    2021年10月5日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号