高性能 Kafka 及常见面试题

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篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

事件循环解析

浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后&…

Java根据excel模版导出Excel(easyexcel、poi)——含项目测试例子拿来即用

Java根据excel模版导出Excel(easyexcel、poi)——含项目测试例子拿来即用 1. 前言1.1 关于Excel的一般导出2.2 关于easyexcel的根据模版导出 2. 先看效果2.1 模版2.2 效果 3. 代码实现(核心代码)3.1 项目代码结构3.2 静态填充例子…

全域增长方法论:帮助品牌实现科学经营,助力长效生意增长

前两年由于疫情反复、供给需求收缩等条件制约,品牌业务均受到不同程度的影响。以双十一和618电商大促为例,就相比往年颇显“惨淡”,大多品牌营销都无法达到理想预期。 随着市场环境不断开放,2023年营销行业开始从低迷期走上了高速…

RPA中国 x UiPath | 第六届RPA极客挑战赛,3月16日上海开赛!

随着人工智能技术的不断进步以及数字化转型的深入,企业对于高效、精准、自动化的业务流程需求日益迫切。RPA技术作为连接人类工作与机器操作的桥梁,正逐渐从规则驱动发展为智能决策的助手。 由RPA中国联合UiPath共同主办的【第六届RPA极客挑战赛】将于2…

高性能API云原生网关 APISIX安装与配置指南

Apache APISIX是Apache软件基金会下的顶级项目,由API7.ai开发并捐赠。它是一个高性能的云原生API网关,具有动态、实时等特点。 APISIX网关可作为所有业务的流量入口,为用户提供了丰富的功能,包括动态路由、动态上游、动态证书、A…

【LeetCode每日一题】938. 二叉搜索树的范围和

2024-2-26 文章目录 [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)思路:写法一:在中间累加写法二:在最后累加 938. 二叉搜索树的范围和 思路: 1.在二叉搜索树中:左子树的结点都小于根节…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求,磕磕碰碰总…

UE5 C++ Widget练习 Button 和 ProgressBar创建血条

一. 1.C创建一个继承Widget类的子类, 命名为MyUserWidget 2.加上Button 和 UserWidget的头文件 #include "CoreMinimal.h" #include "Components/Button.h" #include "Blueprint/UserWidget.h" #include "MyUserWidget.genera…

2步破解官方sublime4

sublime简要破解流程 1.下载sublime官方最新版2. 破解流程 1.下载sublime官方最新版 打开 官方网站下载 portable version 版,省的安装。。解压到任意位置,备份 sublime_text.exe 文件 2. 破解流程 打开网址把文件 sublime_text.exe 拖入网页搜索替换…

飞书公式留存

飞书公式留存 if(and(month([完成日期])>7,month([完成日期])<9),"Q3季度"&#xff0c;if(and(month([完成日期])>10,month([完成日期])<12),"Q4季度"&#xff0c;""))

基于YOLOv5+PySide6的火灾火情火焰检测系统设计深度学习

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225火灾 获取完整源码源文件已标注的数据集&#xff08;1553张&#xff09;配置跑起来说明 可有偿49yuan一对一远程操作&#xff0c;在你电脑跑起来 效果展示&#xff1a; ​数据集在下载的文件夹&#xff1a;yolov5-5.0\…

抽象的后端

Connection refused: no further information 出现这条代码的核心是你使用redis&#xff0c;但是本地没有开启redis服务 如何启动redis服务 第一步&#xff1a;确定你安装了对应的框架 以spring为例 <dependency><groupId>org.springframework.boot</group…

详解POCV/SOCV的时序报告

​POCV/SOCV的时序报告中有如下变量&#xff1a; Mean: 高斯分布中的μ值&#xff08;平均值&#xff09; Sensit: sensitivity&#xff0c;也就是1个Sigma的值&#xff1b; Corner: Sigma边界的最差值 cell的delay Delay mean N * Delay sigma; cell 的Transition Sl…

十一、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法&#xff08;promotion&#xff09;重新定义paintEvent事件 2、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QWidget &#xff08;2&#xff09;添加类&#xff0c;为Widget组件提升类 #inclu…

嵌入式C语言(三)

typeof() 使用typeof可以获取一个变量或表达式的类型。 typeof的参数有两种形式&#xff1a;表达式或类型。 int i;typeof(i) j 20; --> int j 20;typeof(int *) a; -->int *a; int f(); -->typeof(f()) k;--? int k我们可以看出通过typeof获取一个变量的…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据&#xff0c;包括地标&#xff08;Landmark&#xff09;、特征点&#xff08;Feature Point&#xff09;、平面&#xff08;Plane&#xff09;等&#xff0c;以及使用者的操作信息&#xff0c;如使用者添加的 ARAnchor …

LabVIEW高精度闭式微小型循环泵性能测试

LabVIEW高精度闭式微小型循环泵性能测试 开发了一套基于LabVIEW的高精度闭式微小型循环泵性能测试系统&#xff0c;旨在通过先进的测试技术和虚拟仪器技术&#xff0c;对微小型循环泵的性能进行精确测量和分析&#xff0c;从而优化泵的设计和性能&#xff0c;提高其在航空、机…

助力智能化农田作物除草,基于DETR(DEtection TRansformer)模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于DETR模型来开发构建玉米…

Vue-3

自定义指令 全局注册指令 文件路径&#xff1a;src/main.js import Vue from vue import App from ./App.vue Vue.config.productionTip false// 全局注册指令 Vue.directive(myFocus, {// inserted 会在指令所在的元素&#xff0c;被插入到页面中时触发inserted(el) {el.f…

Ps:颜色模式

Photoshop 中的颜色模式 Color Mode定义了图像中使用的颜色系统&#xff0c;这些模式影响图像的颜色表现、文件大小以及可适用的场景。 Ps菜单&#xff1a;图像/模式 Mode 在不同的颜色模式下&#xff0c;会基于不同的通道并使用不同的方式来混合颜色。 RGB、CMYK、Lab 颜色模…