在这里插入图片描述

😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点,期待与你一同探索、学习、进步,一起卷起来叭!

目录

  • 题目
  • 答案
    • 优化生产者
      • 优化acks
      • 优化批次
      • 启用压缩
    • 优化broker
      • 优化 swap
      • 优化网络读写缓冲区
      • 优化磁盘 IO
      • 优化主从同步
      • 优化JVM

题目

💬技术栈:RocketMQ、Kafka、RabbitMQ

🔍简历内容:为解决xx业务高峰期响应时间长、客户端超时问题,通过优化acks、批次并将压缩算法从 Snappy 更换为 LZ4,提高生产者发送效率。经排查,kafka 集群触发了 full GC 之后,停顿时间就会很长,导致 Kafka 吞吐量显著下降,有时候还会导致 Kafka 认为主分区已经崩溃触发主从选举,通过调大 JVM 的堆,并且在堆很大的情况下,启用 G1 垃圾回收器解决了问题。

🚩面试问:Kafka 还有一些参数也对性能有影响,你能介绍一下你是如何优化的吗?


在这里插入图片描述

💡建议暂停思考10s,你有答案了嘛?如果你有不同题解,欢迎评论区留言、打卡。


答案

简历准备:

  • 你维护的业务在使用消息队列的时候,后面优化措施中提到的参数取值都是多少?
  • 你们公司消息队列的各个参数有没有被调过?为什么调?
  • 是否遇到过和消息队列有关的 Bug?如果有,那么怎么解决的?
  • 维护的业务使用消息队列时的 QPS 是多少

场景准备:高并发的消息队列使用场景,要求高效发送、高效消费,不然就会有问题,比如说出现消息积压或者生产者阻塞的问题。

整理思路:从消息队列的生产者、broker 和消费者这三方出发。

优化生产者

优化acks

场景:有一个系统在一个高并发场景下会发送消息到 Kafka,结果发现这个接口在业务高峰的时候响应时间很长,客户端经常遇到超时的问题

排查后:写这段代码的人直接复制了已有的发送消息代码,而原本人家的业务追求的是消息不丢,所以 acks 设置成了 all。实际上这个业务并没有那么严格的消息不丢的要求,完全可以把 acks 设置为 0。

效果:这么一调整,整个接口的响应时间就显著下降了,客户端那边也很少再出现超时的问题。

不过追求消息不丢失的业务场景就不能把 acks 设置为 0 或者 1,这时候就只能考虑别的优化手段,比如说优化批次。

优化批次

场景:生产者发送消息的性能问题。

排查后:因为发送性能太差,导致发送缓冲池已经满了,阻塞了发送者。这个时候我们注意到其实发送速率还没有达到 broker 的阈值,也就是说,broker 其实是处理得过来的。

解决方案:在这种情况下,最直接的做法就是加快发送速率,也就是调大 batch.size 参数,从原本的 100 调到了 500,就没有再出现过阻塞发送者的情况了。

在这里插入图片描述

当然,批次也不是说越大越好。

原因:批次大了的话,生产者这边丢失数据的可能性就比较大。而且批次大小到了一个地步之后,性能瓶颈就变成了 broker 处理不过来了,再调大批次大小是没有用的。最好的策略,还是通过压测来确定合适的批次大小


发送者被阻塞也可能是因为缓冲池太小

解决方案:调大缓冲池

原因:topic、分区太多,每一个分区都有一块缓冲池装着批量消息,导致缓冲池空闲缓冲区不足,这一类不是因为发送速率的问题导致的阻塞,就可以通过调大缓冲池来解决。

在这里插入图片描述

所以发送者阻塞要仔细分析,如果是发送速率的问题,那么调大发送缓冲区是治标不治本的。如果发送速率没什么问题,确实就是因为缓冲池太小引起的,就可以调大缓冲池。如果现实中,也比较难区别这两种情况,就可以考虑先调大批次试试,再调整缓冲池。

启用压缩

场景:Kafka 默认是不启用压缩的,为了进一步提高 Kafka 的吞吐量,我也开启了 Kafka 的压缩功能,使用了 LZ4 压缩算法。【为了进一步提高 Kafka 的吞吐量,我将压缩算法从 Snappy 换到了 LZ4。】

一定要做性能测试

优化broker

优化 swap

Kafka 是一个非常依赖内存的应用,所以可以调小 vm.swappniess 参数来优化内存。

为了优化 Kafka 的性能,可以调小 vm.swappiness。比如说调整到 10,这样就可以充分利用内存;也可以调整到 1,这个值在一些 linux 版本上是指进行最少的交换,但是不禁用交换。目前我们公司用的就是 10。

为什么不直接禁用 swap 呢?

物理内存总是有限的,所以直接禁用的话容易遇到内存不足的问题。我们只是要尽可能优化内存,如果物理内存真的不够,那么使用交换区也比系统不可用好

在这里插入图片描述

优化网络读写缓冲区

Kafka 也是一个网络 IO 频繁的应用,所以调整网络有关的读写缓冲区,效果也会更好。对应的参数有6个。

  • net.core.rmem_default 和 net.core.wmem_default:Socket 默认读写缓冲区大小。
  • net.core.rmem_max 和 net.core.wmem_max:Socket 最大读写缓冲区。
  • net.ipv4.tcp_wmem 和 net.ipv4.tcp_rmem:TCP 读写缓冲区。它们的值由空格分隔的最小值、默认值、最大值组成。可以考虑调整为 4KB、64KB 和 2MB。

回答模板:调大读写缓冲区。Scoket 默认读写缓冲区可以考虑调整到 128KB;Socket 最大读写缓冲区可以考虑调整到 2MB,TCP 的读写缓冲区最小值、默认值和最大值可以设置为 4KB、64KB 和 2MB。不过这些值究竟多大,还是要根据 broker 的硬件资源来确定。

优化磁盘 IO

Kafka 也是一个磁盘 IO 密集的应用,所以可以从两个方向优化磁盘 IO。
(1)使用 XFS 作为文件系统,它要比 EXT4 更加适合 Kafka。相比于 EXT4,XFS 性能更好。在同等情况下,使用 XFS 的 Kafka 要比 EXT4 性能高 5% 左右。XFS还有别的优点,例如扩展性更好,支持更多、更大的文件。
(2)禁用 Kafka 用不上的 atime 功能

优化主从同步

总结: 都调大,它们的效果,就是为了让从分区一批次同步尽可能多的数据

从分区和主分区数据同步的过程受到了几个参数的影响。

  • num.replica.fetchers:从分区拉取数据的线程数量,默认是1。你可以考虑设置成 3。
  • replica.fetch.min.bytes:可以通过调大这个参数来避免小批量同步数据
  • replica.fetch.max.bytes:这个可以调大,比如说调整到 5m,但是不要小于 message.max.byte,也就是不要小于消息的最大长度。
  • replica.fetch.wait.max.ms:如果主分区没有数据或者数据不够从分区的最大等待时间,可以考虑同步调大这个值和 replica.fetch.max.bytes。
    在这里插入图片描述

首先调整从分区的同步数据线程数量,比如说调整到 3,这样可以加快同步速率,但是也会给主分区和网络带宽带来压力。

其次是调整同步批次的最小和最大字节数量,越大则吞吐量越高,所以都尽量调大。

最后也可以调整从分区的等待时间,在一批次中同步尽可能多的数据。

不过调大到一定地步之后,瓶颈就变成了从分区来不及处理。或者调大到超过了消息的并发量,那么也没意义了。

Kafka 这种机制可以看作是典型的批量拉数据模型。在这个模型里面,要着重考虑的就是多久拉一次,没有怎么办,一次拉多少?在实现这种模型的时候,让用户根据自己的需要来设定参数是一个比较好的实践。

优化JVM

Kafka 是运行在 JVM 上的,所以理论上来说任何优化 Java 性能的措施,对 Kafka 也一样有效果。

优化 JVM:

(1)首先就是考虑优化 GC,即优化垃圾回收。而优化 GC 最重要的就是避免 full GC。full GC 是指整个应用都停下来等待 GC 完成。它会带来两方面影响。一方面是发送者如果设置 acks 为 1 或者 all,都会被阻塞,Kafka 吞吐量下降

在这里插入图片描述

(2)如果 full GC 时间太长,那么主分区可能会被认为已经崩溃了,Kafka 会重新选择主分区;而如果是从分区,那么它会被挪出 ISR,进一步影响 acks 设置为 all 的发送者

在这里插入图片描述

基本的思路就是调大 JVM 的堆,并且在堆很大的情况下,启用 G1 垃圾回收器

之前我们的 Kafka 集群还出过 GC 引发的性能问题。我们有一个 Kafka 的堆内存很大,有 8G,但是垃圾回收器还是用的 CMS。触发了 full GC 之后,停顿时间就会很长,导致 Kafka 吞吐量显著下降,并且有时候还会导致 Kafka 认为主分区已经崩溃,触发主从选举

优化思路:

(1)一个是考虑优化 CMS 本身,比如说增大老年代,但是这个治标不治本,可以缓解问题,但是不能根治问题。
(2)直接切换到 G1 回收器。G1 回收器果然表现得非常好,垃圾回收频率和停顿时间都下降了。


往期精彩专栏内容,欢迎订阅:

🔗【八股消消乐】20250711:浅尝Kafka性能优化
🔗【八股消消乐】20250630:消息队列优化—重复消费
🔗【八股消消乐】20250629:消息队列优化—消息丢失
🔗【八股消消乐】20250627:消息队列优化—消息积压
🔗【八股消消乐】20250625:消息队列优化—消息有序
🔗【八股消消乐】20250624:消息队列优化—延迟消息
🔗【八股消消乐】20250623:消息队列优化—系统架构设计
🔗【八股消消乐】20250622:Elasticsearch查询优化
🔗【八股消消乐】20250620:Elasticsearch优化—检索Labubu
🔗【八股消消乐】20250619:构建微服务架构体系—保证服务高可用
🔗【八股消消乐】20250615:构建微服务架构体系—链路超时控制
🔗【八股消消乐】20250614:构建微服务架构体系—实现制作库与线上库分离
🔗【八股消消乐】20250612:构建微服务架构体系—限流算法优化
🔗【八股消消乐】20250611:构建微服务架构体系—降级策略全总结
🔗【八股消消乐】20250610:构建微服务架构体系—熔断恢复抖动优化
🔗【八股消消乐】20250609:构建微服务架构体系—负载均衡算法如何优化
🔗【八股消消乐】20250608:构建微服务架构体系—服务注册与发现
🔗【八股消消乐】20250607:MySQL存储引擎InnoDB知识点汇总
🔗【八股消消乐】20250606:MySQL参数优化大汇总
🔗【八股消消乐】20250605:端午节产生的消费数据,如何分表分库?
🔗【八股消消乐】20250604:如何解决SQL线上死锁事故
🔗【八股消消乐】20250603:索引失效与优化方法总结
🔗【八股消消乐】20250512:慢SQL优化手段总结
🔗【八股消消乐】20250511:项目中如何排查内存持续上升问题
🔗【八股消消乐】20250510:项目中如何优化JVM内存分配?
🔗【八股消消乐】20250509:你在项目中如何优化垃圾回收机制?
🔗【八股消消乐】20250508:Java编译优化技术在项目中的应用
🔗【八股消消乐】20250507:你了解JVM内存模型吗?
🔗【八股消消乐】20250506:你是如何设置线程池大小?
🔗【八股消消乐】20250430:十分钟带背Duubo中大厂经典面试题
🔗【八股消消乐】20250429:你是如何在项目场景中选取最优并发容器?
🔗【八股消消乐】20250428:你是项目中如何优化多线程上下文切换?
🔗【八股消消乐】20250427:发送请求有遇到服务不可用吗?如何解决?

📌 [ 笔者 ]   文艺倾年
📃 [ 更新 ]   2025.7.11
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

在这里插入图片描述

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

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

相关文章

《Java Web程序设计》实验报告二 学习使用HTML标签、表格、表单

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工(共计4人) 2、实验方案 3、实验结果与分析 4、项目任务评价 四、遇到的问题和解决方法 五、实验总结 一、实验目的 1、HTML基础知识、基本概念 2、使用HTML标签、表格进行…

jenkins使用Jenkinsfile部署springboot+docker项目

文章目录前言一、前期准备二、编辑构建文件二、Jenkins构建总结前言 前面使用Jenkinsfile部署了前端vue项目,接着学习Jenkinsfile部署springboot项目。 一、前期准备 已经安装好centos,并且安装了jenkins和docker。本地新建springboot并上传到gitee上。 二、编辑…

使用ESM3蛋白质语言模型进行快速大规模结构预测

文章目录ESM3介绍ESM3在线使用本地使用api批量预测ESM相较于AlphaFold的优势ESM3介绍 ESM3是由EvolutionaryScale(前Meta团队)开发的一款蛋白质大语言模型,于2025年以《用语言模型模拟 5 亿年的进化》为题正式发表在Science上 文章链接: htt…

PostgreSQL 时间/日期管理详解

PostgreSQL 时间/日期管理详解 引言 PostgreSQL是一款功能强大的开源关系型数据库管理系统,在时间/日期管理方面具有独特的优势。本文将详细介绍PostgreSQL中时间/日期数据类型及其相关功能,帮助读者更好地理解和应用时间/日期管理。 时间/日期数据类型 …

Agent篇

Agent包含哪些模块,实现了什么功能Agent 就像一个多功能的接口,它能够接触并使用一套工具。根据用户的输入,Agent会规划出一条解决用户问题的路线,决定其中需要调用哪些工具,并调用这些工具。Agent 大语言模型规划记忆…

利用 MySQL 进行数据清洗

利用 MySQL 进行数据清洗是数据预处理的重要环节,以下是常见的数据清洗操作及对应 SQL 示例:1. 去除重复数据使用 ROW_NUMBER() 或 GROUP BY 识别并删除重复记录。-- 查找重复记录(以 user_id 和 email 为例) WITH Duplicates AS …

【MySQL笔记】事务的ACID特性与隔离级别

目录1. 什么是事务?2. 事务的ACID特性(重要)3. 事务控制语法4. 隔离级别与并发问题1. 什么是事务? 事务(Transaction)是由一组SQL语句组成的逻辑单元,这些操作要么全部成功,要么全部…

Mock 数据的生成与使用全景详解

Mock 数据的生成与使用全景详解 在后端开发过程中,真实数据往往受限于业务进度、隐私保护或接口未完成等因素,无法及时获取。这时,Mock数据(模拟数据)就成为开发、测试、联调不可或缺的利器。本文将从Mock数据的意义、常用场景、主流工具、实战案例到最佳实践,带你全面掌…

HTML 标题标签

需求&#xff1a;在网页显示六级标题标签。代码&#xff1a;//需求&#xff1a;在网页显示六级标题标签。 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><h1>一级标题&l…

(限免!!!)全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)

选择题部分在 C 中&#xff0c;以下代表布尔类型的是&#xff08;  &#xff09;选项&#xff1a;A. double B. bool C. int D. char答案&#xff1a;B解析&#xff1a;C 中布尔类型的关键字为bool&#xff0c;用于存储逻辑值true或false。执行以下程序&#xff0c;输出的…

编译器优化——LLVM IR,零基础入门

编译器优化——LLVM IR&#xff0c;零基础入门 对于大多数C开发者而言&#xff0c;我们的代码从人类可读的文本到机器可执行的二进制文件&#xff0c;中间经历的过程如同一个黑箱。我们依赖编译器&#xff08;如GCC, Clang, MSVC&#xff09;来完成这项复杂的转换。然而&#x…

react中为啥使用剪头函数

在 React 中使用箭头函数&#xff08;>&#xff09;主要有以下几个原因&#xff1a;1. 自动绑定 this传统函数的问题&#xff1a;在类组件中&#xff0c;普通函数的this指向会根据调用方式变化&#xff0c;导致在事件处理函数中无法正确访问组件实例&#xff08;this为undef…

JavaSE-多态

多态的概念在完成某个行为时&#xff0c;不同的对象在完成时会呈现出不同的状态。比如&#xff1a;动物都会吃饭&#xff0c;而猫和狗都是动物&#xff0c;猫在完成吃饭行为时吃猫粮&#xff0c;狗在完成吃饭行为时吃狗粮&#xff0c;猫和狗都会叫&#xff0c;狗在完成这个行为…

TDengine 使用最佳实践(2)

TDengine 使用最佳实践&#xff08;1&#xff09; 安装部署 目录规划 软件安装 参数配置 时钟同步 验证环境 集群部署 写入查询 连接方式 数据写入 数据查询 运维巡检 运维规范 数据库启停 状态检查 运维技巧 日常巡检 数据库升级 故障排查 故障定位 日志调试 故障反馈 关于 T…

如何通过公网IP访问部署在kubernetes中的服务?

背景说明我们有些私有化部署的项目&#xff0c;使用k8s来承载服务&#xff0c;通过ingress-nginx转发外部的请求到集群。有时候业主的域名没有申请下来&#xff0c;我们会配置临时的域名&#xff0c;测试同事配置主机hosts来完成功能验证&#xff0c;等功能验证完毕后&#xff…

Datawhale AI 夏令营2025科大讯飞AI大赛<夏令营:用AI做带货视频评论分析>

赛题题目 任务一&#xff1a;商品识别 基于视频内容识别对应的商品 【情感分析】对评论文本进行多维度情感分析&#xff0c;涵盖维度见数据说明&#xff1b; 任务二&#xff08;文本分类&#xff09;&#xff1a;从非结构化评论中提取情感倾向 评论聚类】按商品对归属指定维度的…

AI 时代的分布式多模态数据处理实践:我的 ODPS 实践之旅、思考与展望

AI 时代的分布式多模态数据处理实践&#xff1a;我的 ODPS 实践之旅、思考与展望 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 1. 什…

硬件工程师笔试面试高频考点汇总——(2025版)

目录 1 电子器件部分 1.1 电阻 1.1.1 电阻选型时一般从哪几个方面进行考虑? 1.1.2 上拉下拉电阻的作用 1.1.3 PTC热敏电阻作为电源电路保险丝的工作原理 1.1.4 如果阻抗不匹配&#xff0c;有哪些后果 1.1.5 电阻、电容和电感0402、0603和0805封装的含义 1.1.6 电阻、电…

华为HarmonyOS 5.0深度解析:跨设备算力池技术白皮书(2025全场景智慧中枢)

​​摘要​​HarmonyOS 5.0的​​跨设备算力池技术​​正在重构终端计算范式。本文首次系统性拆解其技术内核&#xff1a;通过​​异构硬件资源虚拟化​​、​​任务流图调度引擎​​、​​确定性时延网络​​三大支柱&#xff0c;实现手机、汽车、智慧屏等设备的算力动态聚合与…

ASP.NET Core 中的延迟注入:原理与实践

在软件开发中&#xff0c;依赖注入已成为构建可维护、可测试和可扩展应用程序的核心模式。ASP.NET Core 内置的依赖注入容器为我们管理服务生命周期提供了极大的便利。然而在某些特定场景下&#xff0c;我们可能不希望某个依赖项在宿主对象被创建时立即实例化&#xff0c;而是希…