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

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.xdnf.cn/news/8353.html

相关文章:

  • halcon 连接相机
  • 消息队列RabbitMQ与AMQP协议详解
  • oracle数据库生成awr报告,排查数据库服务器CPU100%,系统卡顿,慢sql,根据sqlid查询关键信息,如会话SID,客户端机器名
  • 从零搭建SpringBoot Web单体项目3、SpringBoot 核心组件深度解析
  • leetcode hot100:十三、解题思路大全:多维动态规划(不同路径、最小路径和、最长回文子串、 最长公共子序列、编辑距离)
  • 微信小程序用<web-view 嵌入h5网页,改了h5网页后,可能是缓存的原因,小程序上看还是原来的,怎么处理
  • 【MySQL成神之路】MySQL索引相关介绍
  • 应届本科生简历制作指南
  • MySQL数据 在 磁盘上是什么样子的
  • DiagramJS设计原理解读(二)
  • CUDA 加速的基础线性代数库cuBLAS
  • Issac Lab安装
  • SPL做量化---MFI(资金流量指标)
  • 水陆两栖车,水域救援与陆地行动的桥梁
  • 掌握正则表达式:从基础语法到工程实践
  • Redis--SpringDataRedis详解
  • KCTF-CCG CrackMe crypto 1.0
  • TDengine 高可用——三副本
  • YOLOv5:调用官方权重进行检测
  • Socket套接字概述
  • MFC 中实现动态控件启用与命令执行
  • nRF Connect SDK开发之(1)运行一个Zephyr Project例程
  • Python Web开发基础
  • 并发编程之常用原子类
  • 免费直播预告 | 从标准解读到工具落地,《GB/T 45086与ISO11451标准解读》来了!
  • 前端学习笔记——Promis.All
  • ROS_Noetic的安装
  • 机器学习实战:犯罪率预测模型
  • 深入探讨Java循环:类型、性能与优化
  • CrackMe 002