高性能 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篇

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

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

相关文章

嵌入式驱动学习第一周——git的使用

前言 本文主要介绍git的使用,包括介绍git,gitee,以及使用gitee创建仓库并托管代码 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏&#xf…

【C进阶】顺序表详解

文章目录 📝线性表的概念🌠 顺序表🌉顺序表的概念 🌠声明--接口🌉启动🌠初始化🌉扩容🌠尾插🌉 打印🌠销毁🌉 尾删🌠头插🌉…

探索便捷办公新选择:ONLYOFFICE 桌面编辑器

目录 引言 1. ONLYOFFICE 桌面编辑器简介 2. 功能特点 2.1 多格式支持 2.2 实时协作编辑 2.3 兼容性与格式保持 2.4 丰富的编辑功能 3. 使用方法 3.1 下载安装 3.2 打开文档 3.3 编辑文档 3.4 保存和共享 4. 注意事项 4.1 版本更新 4.2 网络连接 4.3 安全性 5.…

FL Studio Producer Edition2024中文进阶版Win/Mac

FL Studio Producer Edition,特别是其【中文进阶版 Win/Mac】,是数字音乐制作领域中的一款知名软件。它为广大音乐制作人、声音工程师以及音乐爱好者提供了一个从音乐构思到最终作品发布的完整解决方案。这个版本特别为中文用户优化,并兼容W…

【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例

目录 一、Android Studio下载地址二、开发环境JDK三、开始安装Android Studio四、案例展示与搭建五、人工智能算法模型移动端部署案例参考 一、Android Studio下载地址 https://developer.android.google.cn/studio/install.html 电脑配置要求: 下载保存在指定文…

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

Linux按键输入实验-创建按键的设备节点

一. 简介 Linux内核针对 GPIO驱动开发,提供了 pinctrl子系统与gpio子系统,方便了 GPIO驱动程序的开发。 本文开始学习如何利用 Linux内核的 pinctrl子系统,与 gpio子系统提供的 API函数,开发按键驱动。 这里主要学习在设备树文件中创建按键的设备节点。 二. Linux按键…

C# 学习第三弹——表达式

表达式操作数运算符 (一)算数运算符 错误例子:这不是python!!!!!!!!!!!!! 正确结果&a…

css transform 会影响position 定位

比如通过以下代码.实现导航条上的每个li栏目,以不同的时间间隔,从上向下移动进来并显示 .my-navbar ul li {position: relative;opacity: 0;transform: translateY(-30px);transition: transform .6s cubic-bezier(.165,.84,.44,1),opacity .6s cubic-bezier(.165,.84,.44,1);…

【力扣 - 有效的括号】

题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同…

【数据结构】线性表 顺序表(动态、静态分配,插入删除查找基本操作)解析+完整代码

1.线性表的基本概念 定义 线性表(Linear List)是具有相同数据类型的n个数据元素的有限序列。 n为表长,n0时线性表是个空表 前驱、后继 前驱:其中一个数据元素的前一个元素。第一个元素没有前驱。后继:其中一个数据元素…

使用R语言进行多元线性回归分析-多重共线的诊断

一、数据集 序号X1x2x3x4Y序号X1x2x3X4Y12666078.57831224472.51229155274.31954182293.12356850104.3111047426115.92143184787.6111140233483.8155263395.971266912113.311655922109.2111368812109.410771176102.73       1、从中选取主要变量,建立与因变…

SQL注入漏洞解析--less-46

我们先看一下46关 他说让我们先输入一个数字作为sort,那我们就先输入数字看一下 当我们分别输入1,2,3可以看到按照字母顺序进行了排序,所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 当输入时出现报错提示,说…

AI一键生成3D模型!

一、Genie Genie 是 Luma AI 推出的一个文本到 3D 的生成模型,可以在 10 秒生成 4 款 3D 模型,自动精修后质感非常逼真,目前支持免费使用。 此次的 1.0 版本更新后将生成功能由 Discord 转到了单独的网页,使用起来更方便&#x…

无法访问云服务器上部署的Docker容器(二)

说明:记录一次使用公网IP 接口地址无法访问阿里云服务接口的问题; 描述 最近,我使用Docker部署了jeecg-boot项目,部署过程都没有问题,也没有错误信息。部署完成后,通过下面的地址访问后端Swagger接口文档…

CleanMyMac4苹果Mac电脑全面、高效的系统清理工具

CleanMyMac 4 for Mac是一款专为Mac用户设计的系统清理和优化工具。它具备多种功能,旨在帮助用户轻松管理和释放Mac上的磁盘空间,同时提升系统性能。 系统垃圾清理:CleanMyMac 4能够深入扫描Mac的每一个角落,智能识别并清除不需要…

LDR6020双盲插音频随便插充电听歌随便插

随着智能手机的普及和功能的日益丰富,手机已经成为我们日常生活中不可或缺的一部分。音乐、电影、游戏等娱乐内容更是丰富了手机的使用体验。而在这其中,音频转接器的作用愈发凸显,特别是在边听边充的场景下,一款高效且便捷的手机…

实践航拍小目标检测,基于轻量级YOLOv8n开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践,感兴趣的话可以自行移步阅读即可: 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测,基于yolov…

小龙虾优化算法COA求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、小龙虾优化算法COA 小龙虾优化算法(Crayfsh optimization algorithm,COA)由Jia Heming 等人于2023年提出,该算法模拟小龙虾的避暑、竞争和觅食行为,具有搜索速度快,搜索能力强,能够有效平衡…

★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树

★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树:star:思路分析递归解法 105. 从前序与中序遍历序列构造二叉树递归解法 ---------------🎈🎈题目链接&a…