高性能 Kafka 及常见面试题

news2025/7/19 7:52:28

Kafka 是一种分布式的,基于发布/订阅的消息系统,原本开发自 LinkedIn,用作 LinkedIn 的事件流(Event Stream)和运营数据处理管道(Pipeline)的基础。

基础原理详解可见 Kafka 基本架构及原理

基础架构

  • Broker:Kafka 集群包含一个或多个服务器,这种服务器被称为 broker
  • Topic:每条发布到 Kafka 集群的消息都有一个类别,这个类别被称为 Topic。(物理上不同 Topic 的消息分开存储,逻辑上一个 Topic 的消息虽然保存于一个或多个 broker 上但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)
  • Partition:Parition(分片)是物理上的概念,每个 Topic 包含一个或多个 Partition.
  • Producer:负责发布消息到 Kafka broker
  • Consumer:消息消费者,向 Kafka broker 读取消息的客户端。
  • Consumer Group:每个 Consumer 属于一个特定的消费者组Consumer Group(可为每个 Consumer 指定 group name,若不指定 group name 则属于默认的 group)。

在这里插入图片描述

如上图所示,Producer 使用push模式将消息发布到 broker,Consumer 使用pull模式从 broker 订阅并消费消息。

Kafka 通过 Zookeeper 管理集群配置,选举 leader,以及在 Consumer Group 发生变化时进行rebalance

优点及应用场景

优点

  • 高吞吐量:单机每秒处理几十上百万的消息量。即使存储了TB及消息,也保持稳定的性能。
    • 零拷贝 减少内核态到用户态的拷贝,磁盘通过sendfile实现DMA 拷贝Socket buffer
    • 顺序读写 充分利用磁盘顺序读写的超高性能
    • 页缓存mmap 将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。
  • 高性能:单节点支持上千个客户端,并保证零停机和零数据丢失。
  • 持久化:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。
  • 分布式系统:易扩展。所有的组件均为分布式的,无需停机即可扩展机器。
  • 可靠性:Kafka是分布式,分区,复制和容错的。
  • 客户端状态维护:消息被处理的状态是在Consumer端维护,当失败时能自动平衡。

应用场景

  • 日志收集:用Kafka可以收集各种服务的Log,通过大数据平台进行处理;
  • 消息系统:解耦生产者和消费者、缓存消息等;
  • 用户活动跟踪:Kafka经常被用来记录Web用户或者App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做运营数据的实时的监控分析,也可保存到数据库;

高性能

Kafka 的性能优化中是常见的方法:

  1. 时间轮(Time Wheel):时间轮是一种定时调度的算法,可以用于 Kafka 中的延迟消息处理。通过将消息按照一定的时间间隔划分到不同的槽位,可以实现高效的消息调度和处理。
  2. 零拷贝(Zero-copy):零拷贝是一种优化技术,通过避免数据在内核空间和用户空间之间的拷贝,减少了数据传输的开销。在 Kafka 中,通过使用零拷贝技术可以提高数据的传输效率和降低CPU的开销。
  3. IO多路复用(IO Multiplexing):IO多路复用是一种高效的IO处理模型,可以通过同时监听多个IO事件,以非阻塞的方式处理多个连接。在 Kafka 中,使用IO多路复用可以提高网络IO的处理性能,减少线程的数量,提高系统的吞吐量。
  4. 顺序读写(Sequential Read/Write):在 Kafka 中,数据是以分区为单位进行顺序写入和顺序读取的。通过保持写入和读取的顺序,可以减少磁盘的随机访问,提高IO的效率。
  5. 压缩批处理(Compression and Batch Processing):Kafka 支持对消息进行压缩,并且可以将多个消息批量发送。通过压缩和批量处理,可以减少网络传输的数据量,提高传输效率和吞吐量。

这些技术在 Kafka 的设计和实现中发挥了重要作用,帮助 Kafka 实现了高性能、高吞吐量的特性。在使用 Kafka 时,可以根据具体的场景和需求,结合这些技术来进行性能优化和调优。

零拷贝

当使用零拷贝技术时,数据在内核空间和用户空间之间的传输是通过以下几个关键组件和步骤完成的:

  • 内核缓冲区(Kernel Buffer):内核缓冲区是位于内核空间的一块内存区域,用于存储从用户空间写入的数据或从网络接收的数据。
  • 用户缓冲区(User Buffer):用户缓冲区是位于用户空间的一块内存区域,用于存储应用程序读取或写入的数据。
  • 零拷贝系统调用:操作系统提供了一些特定的系统调用,例如sendfile()writev(),用于在内核空间和用户空间之间实现数据的零拷贝传输

下面是零拷贝技术在 Kafka 中的更详细工作流程:

生产者端

  1. 生产者将要发送的消息写入发送缓冲区,该缓冲区位于用户空间
  2. 生产者调用零拷贝系统调用(如sendfile()writev()),将发送缓冲区的数据直接传输到内核缓冲区
  3. 内核将数据从内核缓冲区传输到网络套接字缓冲区,而无需将数据从内核空间复制到用户空间

Kafka 服务端

  1. 客户端发送的消息到达 Kafka 服务端,数据存储在网络套接字缓冲区
  2. Kafka 服务端使用零拷贝技术,将网络套接字缓冲区的数据直接复制到内核缓冲区
  3. Kafka 服务端根据配置的存储策略,将数据写入磁盘或存储设备

消费者端

  1. 消费者从网络接收消息,数据存储在接收缓冲区(Receive Buffer)
  2. 消费者使用零拷贝技术,直接从接收缓冲区读取数据,而无需将数据从内核空间复制到用户空间
  3. 消费者对数据进行处理或存储,完成消费过程

通过使用零拷贝技术,Kafka 避免了不必要的数据拷贝,提高了数据的传输效率和整体性能。它减少了CPU的开销和内存带宽的使用,特别在处理大量数据和高吞吐量的场景中表现出色。同时,零拷贝技术还可以减少系统调用的次数,进一步提高性能

常见面试题

本段参考自阿里技术 这些年背过的面试题——Kafka篇

线上问题rebalance

因集群架构变动导致的消费组内重平衡,如果kafka集内节点较多,比如数百个,那重平衡可能会耗时导致数分钟到数小时,此时kafka基本处于不可用状态,对kafka的TPS影响极大。

产生的原因:

  • 组成员数量发生变化
  • 订阅主题数量发生变化
  • 订阅主题的分区数发生变化

**组成员崩溃和组成员主动离开是两个不同的场景。**因为在崩溃时成员并不会主动地告知coordinator此事,coordinator有可能需要一个完整的session.timeout周期(心跳周期)才能检测到这种崩溃,这必然会造成consumer的滞后。可以说离开组是主动地发起rebalance;而崩溃则是被动地发起rebalance。

解决方案:

加大超时时间 session.timout.ms=6s
加大心跳频率 heartbeat.interval.ms=2s
增长推送间隔 max.poll.interval.ms=t+1 minutes

ZooKeeper 的作用

目前,Kafka 使用 ZooKeeper 存放集群元数据、成员管理、Controller 选举,以及其他一些管理类任务。之后,等 KIP-500 提案完成后,Kafka 将完全不再依赖于 ZooKeeper。

  • 存放元数据是指主题分区的所有数据都保存在 ZooKeeper 中,其他“人”都要与它保持对齐。
  • 成员管理是指 Broker 节点的注册、注销以及属性变更等 。
  • Controller 选举是指选举集群 Controller,包括但不限于主题删除、参数配置等。

KIP-500 ,是使用社区自研的基于 Raft 的共识算法,实现 Controller 自选举。

同样是存储元数据,这几年基于Raft算法的etcd认可度越来越高。
越来越多的系统开始用它保存关键数据。比如,秒杀系统经常用它保存各节点信息,以便控制消费 MQ 的服务数量。还有些业务系统的配置数据,也会通过 etcd 实时同步给业务系统的各节点,比如,秒杀管理后台会使用 etcd 将秒杀活动的配置数据实时同步给秒杀 API 服务各节点。

Replica副本的作用

Kafka 只有 Leader 副本才能 对外提供读写服务,响应 Clients 端的请求。Follower 副本只是采用拉(PULL)的方 式,被动地同步 Leader 副本中的数据,并且在 Leader 副本所在的 Broker 宕机后,随时准备应聘 Leader 副本。

  • 自 Kafka 2.4 版本开始,社区可以通过配置参数,允许 Follower 副本有限度地提供读服务。
  • 之前确保一致性的主要手段是高水位机制, 但高水位值无法保证 Leader 连续变更场景下的数据一致性,因此,社区引入了 Leader Epoch 机制,来修复高水位值的弊端。

为什么不支持读写分离?

  • 自 Kafka 2.4 之后,Kafka 提供了有限度的读写分离。
  • 场景不适用。读写分离适用于那种读负载很大,而写操作相对不频繁的场景。
  • 同步机制。Kafka 采用 PULL 方式实现 Follower 的同步,同时复制延迟较大。

如何防止重复消费

  • 代码层面每次消费需提交offset;
  • 通过Mysql的唯一键约束,结合Redis查看id是否被消费,存Redis可以直接使用set方法;
  • 量大且允许误判的情况下,使用布隆过滤器也可以

如何保证顺序消费

  • 单 topic,单partition,单 consumer,单线程消费,吞吐量低,不推荐;
  • 如只需保证单key有序,为每个key申请单独内存 queue,每个线程分别消费一个内存 queue 即可,这样就能保证单key(例如用户id、活动id)顺序性

如何解决积压消费

  1. 修复consumer,使其具备消费能力,并且扩容N台;
  2. 写一个分发的程序,将Topic均匀分发到临时Topic中;同时起N台consumer,消费不同的临时Topic

如何避免消息积压

  • 提高消费并行度
  • 批量消费
  • 减少组件IO的交互次数
  • 优先级消费
if (maxOffset - curOffset > 100000) {  
	// TODO 消息堆积情况的优先处理逻辑  
	// 未处理的消息可以选择丢弃或者打日志  
	return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
// TODO 正常消费过程
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;

如何设计消息队列

需要支持快速水平扩容,broker+partition,partition放不同的机器上,增加机器时将数据根据topic做迁移,分布式需要考虑一致性、可用性、分区容错性

  • 一致性:生产者的消息确认、消费者的幂等性、Broker的数据同步;
  • 可用性:数据如何保证不丢不重、数据如何持久化、持久化时如何读写;
  • 分区容错:采用何种选举机制、如何进行多副本同步;
  • 海量数据:如何解决消息积压、海量Topic性能下降;

性能上,可以借鉴时间轮、零拷贝、IO多路复用、顺序读写、压缩批处理


  1. Kafka 基本架构及原理
  2. 这些年背过的面试题——Kafka篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1474025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 16种妙用

1、缓存 2、数据共享分布式 3、分布式锁 4、全局ID 5、计数器 6、限流 7、位统计 8、购物车 9、用户消息时间线timeline 10、消息队列 11、抽奖 12、点赞、签到、打卡 13、商品标签 14、商品筛选 15、用户关注、推荐模型 16、排行榜 1、缓存 String类型 例如:热点…

算法【线性表的查找-顺序查找】

线性表的查找-顺序查找 顺序查找基本思想应用范围顺序表的表示数据元素类型定义查找算法示例分析 时间效率分析顺序查找的特点如何提高查找效率 顺序查找 基本思想 在表的多种结构定义方式中,线性表是最简单的一种。而顺序查找是线性表查找中最简单的一种。 顺序查…

Netty NIO 非阻塞模式

1.概要 1.1 说明 使用非阻塞的模式,就可以用一个现场,处理多个客户端的请求了 1.2 要点 ssc.configureBlocking(false);if(sc!null){ sc.configureBlocking(false); channels.add(sc); }if(len>0){ byteBuffer.flip(); 2.代码 2.1 服务端代码 …

YOLOv8改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C2f结构(附轻量化版本 + 高效涨点版本 + 结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv8中的C2f,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本…

提高工作效率,《Linux常用命令文件配置》

在IC设计领域,所有的开发任务几乎都是在Linux操作系统上完成,因此需要掌握Linux操作系统的使用;Linux可以为工程师提供更好的开发环境和调试工具。还支持多种开发语言和编程环境,可以为数字IC芯片工程师提供更多的选择和灵活性。 作为IC工程…

c++ 继承虚基类

virtual加在b1b2,这样d类仅会有一个a类

Spark之【基础介绍】

Spark最初是由美国伯克利大学AMP实验室在2009年开发,Spark时基于内存计算的大数据并行计算框架,可以用于构建大型的、低延迟的数据分析应用程序。 Spark是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台之一。 Spark的特点 运行速度快 &am…

图解 Electron 进程模型

此前,已经介绍了《如何从 0 开始,创建一个 Electron 的 App》,每个人就有了一个梦开始的地方。如果想实现一个功能丰富的 App,了解一点基础知识,是非常必要的。比如,Electron 的进程模型。 一、简介 Chrome…

ChatGPT 国内快速上手指南

ChatGPT简介 ChatGPT是由OpenAI团队研发的自然语言处理模型,该模型在大量的互联网文本数据上进行了预训练,使其具备了深刻的语言理解和生成能力。 GPT拥有上亿个参数,这使得ChatGPT在处理各种语言任务时表现卓越。它的训练使得模型能够理解上…

office word保存pdf高质量设置

1 采用第三方pdf功能生成 分辨率越大质量越好

C语言中strstr函数的使用!

strstr函数的作用是什么&#xff1f; 查找子字符串 具体直接看下面的这段代码我相信你必明白 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char *p1 "abcdefghijklmnopqrstuvwxyz"; char* p2 "abc"; char* r…

深度学习手写字符识别:推理过程

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

数据库:MySQL查询一个数据表中不含另一个数据表的内容

例子&#xff1a;查询数据库中 public_codename 表中 id 不包含在 public_code 表的 code_id 字段中的数据 SELECT * FROM public_codename WHERE id NOT IN (SELECT code_idFROM public_code );

visual studio2022使用tensorRT配置

只记录tensorRT在vs中使用时的配置&#xff0c;下载和安装的 文章主页自己寻找。 下载好TensorRT和对应的cuda之后&#xff0c;把tensorRT的锻炼了和lib文件复制粘贴到cuda对应的文件夹中&#xff0c;以方便调用。 完成之后打开vs新建一个tensorRT的项目&#xff0c;然后开始配…

日更【系统架构设计师知识总结3】存储系统

【原创精华总结】自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助&#xff01;

ClickHouse 指南(三)最佳实践 -- 跳数索引

Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…

iPhone利用文件管理器批量导出语音备忘录和照片到电脑

步骤1&#xff1a;使用文件服务器在 iPhone 和电脑间共享文件 参考文献&#xff1a;苹果官网操作指南 步骤1.1&#xff1a;iPhone上打开文件app&#xff0c;点击右上角三个点&#xff0c;选择“连接服务器” 步骤1.2&#xff1a;输入电脑的登录账号和密码 步骤1.3&#xff1a…

设计模式(十) - 工厂方式模式

前言 在此前的设计模式&#xff08;四&#xff09;简单工厂模式中我们介绍了简单工厂模式&#xff0c;在这篇文章中我们来介绍下工厂方法模式&#xff0c;它同样是创建型设计模式&#xff0c;而且又有些类似&#xff0c;文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

SpringCloud有哪些组件

什么是SpringCloud&#xff1f; Spring Cloud是基于Spring Boot的分布式系统开发工具&#xff0c;它提供了一系列开箱即用的、针对分布式系统开发的特性和组件&#xff0c;用于帮助开发人员快速构建和管理云原生应用程序。 Spring Cloud的主要目标是解决分布式系统中的常见问题…

mybatis 集成neo4j功能实现

文章目录 前言一、引入jar包依赖二、配置 application.properties三、Mybatis Neo4j分页插件四、Mybatis Neo4j自定义转换器handler五、MybatisNeo4j代码示例总结 前言 MyBatis是一个基于Java语言的持久层框架&#xff0c;它通过XML描述符或注解将对象与存储过程或SQL语句进行…