当前位置: 首页 > article >正文

kafka吞吐量提升总结

前言

原本自以为阅读了很久kafka的源码,对于kafka的了解已经深入到一定程度了,后面在某大厂的面试中,面试官询问我,如果需要提升kafka的性能,应该怎么做,我发现我能答上来的点非常的少,也暴露了我在学习时候缺少总结,导致要用的时候很难一次性快速表达出来,也让我错过了一个大厂的offer,尽管我在面试之后迅速做了相关问题总结,而且已经过去了半年,但是我还是会时不时想起这件事,所以想专门写一篇kafka性能提升的总结文章来超度那件事,让它不要再纠缠与我了,

一 生产者

1.1 配置优化

1 增加每个分区的消息批的大小( batch.size: 16k),适当增加批的最大缓存时间( linger.ms)让生产者累积器中的每个Sender可以累积更多的消息再发送,减少网络请求次数,同时也能增加broker硬盘IO的存储效率(每次顺序写入的多)

2 增加生产者中累积器的内存缓冲区(buffer.memory: 32M)大小,当累积器的缓冲区用完时,也会吧消息发送给broker,通过增加增加生产者中累积器,也可以减少网络请求次数

4 压缩消息(compression.type:none-默认不压缩),可以选择 gzip、snappy、lz4、zstd 等。减少网络传输的数据量,但是会增加cpu负担,可以在网络流量和cpu之间找到一个平衡点

5 在必要条件时,可以吧ack设置为0,但是会使得丢消息的概率提高

1.2 代码优化

1 多线程生产,多个线程使用多个生产者并行生产消息

2 异步生产,生产者发送消息本身涉及网络IO,而且除了异常处理外我们不太需要关注返回结果,所以可以通过线程池等异步生产消息,避免堵塞主线程,提升系统整体性能

3 批量生产和压缩:尽管kafka生产者本身已经通过批量生产做了性能优化,但是这个并不妨碍我们在必要的时候自行积累数据批量发送(甚至手动压缩)来减少网络IO,提升整体吞吐量,毕竟kafka的批量生产和压缩都是通用的算法,有时候我们可能根据业务数据的特点使用更加高效的批量生产和压缩

二 消费者

2.1 配置优化

1 调整每次拉取消息的量(fetch.min.bytes和fetch.max.bytes)减少网络IO

2.2 代码优化

1 并行处理,消费者内部使用多线程处理消息。

2.3 部署优化

1 通过分区和消费者的关系,可以知道如果分区数和消费者数相同时候,可以充分利用并行处理能力

三 broker

3.1 配置优化

1 节点配置的优化,比如IO线程数(handler的数量:num.io.threads),网络线程数(Processor的数量:num.network.threads),还有套接字缓冲区的大小(socket.send.buffer.bytes/socket.receive.buffer.bytes)

3 对kafka的jvm进行调优,比如内存和 GC方面优化

5 优化分区副本的放置,确保高可用的同时,避免跨数据中心的复制延迟

3.2 部署优化

1 适当增加topic的分区数,充分运用到多个broker资源和broker内部的并行处理能力,但需注意过多的分区可能导致的问题。

2 使用固态硬盘等增加硬盘性能,优化文件存储目录的布局以减少 I/O 竞争,如果有多个硬盘,尽量让日志文件分布在多个硬盘上

3 采用 LogDir 多个目录分散写入负载。

http://www.lryc.cn/news/2384631.html

相关文章:

  • AI浪潮下,第五消费时代的商业进化密码
  • Vue组件开发深度指南:构建可复用与可维护的UI
  • 青少年编程与数学 02-019 Rust 编程基础 20课题、面向对象
  • Jouier 普及组十连测 R4
  • bi平台是什么意思?bi平台具体有什么作用?
  • 【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】
  • Redis从入门到实战 - 原理篇
  • 26考研|高等代数:线性变换
  • VSCode如何像Pycharm一样“““回车快速生成函数注释文档?如何设置文档的样式?autoDocstring如何设置自定义模板?
  • Linux(5)——再谈操作系统
  • TCP实现双向通信练习题
  • PCIe学习笔记(3)链路初始化和训练
  • Python爬虫(35)Python爬虫高阶:基于Docker集群的动态页面自动化采集系统实战
  • 运维打铁:生产服务器用户权限管理方案全解析
  • 华为云Astro前端页面数据模型选型及绑定IoTDA物联网数据实施指南
  • 【工具类】常用的工具类——CollectionUtil
  • Oracle 11g导出数据库结构和数据
  • 零基础设计模式——创建型模式 - 抽象工厂模式
  • 解锁内心的冲突:神经症冲突的理解与解决之道
  • JVM—Java对象
  • Redisson读写锁和分布式锁的项目实践
  • Https流式输出一次输出一大段,一卡一卡的-解决方案
  • SkyWalking高频采集泄漏线程导致CPU满载排查思路
  • 【HarmonyOS 5】Map Kit 地图服务之应用内地图加载
  • ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e)
  • sentinel核心原理-高频问题
  • 通过vue-pdf和print-js实现PDF和图片在线预览
  • RxJS 核心操作符详细用法示例
  • 视频监控管理平台EasyCVR结合AI分析技术构建高空抛物智能监控系统,筑牢社区安全防护网
  • 2.2.1 05年T1复习