Kafka 性能调优实战:同等资源配置性能提升 20 几倍的秘诀
作者 | 丁威 责编 | 欧阳姝黎
抛出问题
笔者最近在折腾数据异构体系,在实现MySQL增量数据同步到MQ(Kafka、RocketMQ),本文的故事就从这里开始。
众所周知,为了提高写入端的并发性能,通常会采用多线程并发机制,提高写入端的性能,接下来基于MySQL增量同步到Kafka为例,阐述一下第一版的架构方案。
真实的数据同步架构设计复杂性远比上面复杂,上图旨在阐述Kafka的使用特点:
为了提高性能,通常会引入多线程,故组内同事直接采用多线程,通过创建多个线程,每一个线程单独创建一个KafkaProducer对象,然后binlog解析器后,按照分区键进行负载均衡。
但发现,性能非常低下,为什么呢?该如何处理呢?
多线程在Kafka这里为啥不好使了
当发现性能比较慢,然后又按照 Kafka性能优化指南进行调优,对linger.ms,batch.size等参数进行调优,但发现毫无用处,这是为啥呢?
Kafka的高吞吐率设计的核心要点之一是批处理,即kafka在消息发送端引入了一个双端队列,应用程序通过KafkaProducer的send方法时,会将消息先放入到双端队列,然后kafka使用一个异步线程从队列中成批发送消息。
为了确保sender线程能一次发送较多数据,kafka在客户端引入了一个参数linger.ms,默认为200ms,即小心进入到缓存区后不会立即被send线程发送,而是等待一定时间,这样能提高send线程的发送效率,提高吞吐率。
再回到上述到场景,将视角切换到单个线程,在单个线程内,应用方调用KafkaProducer后,消息会在缓存区中等待200ms,但由于是数据同步场景,消息发送使用的是同步发送,这样就会导致不管send线程等多久,永远只会有一条消息被发送,每条消息发送还要无缘无故的增加200ms的延迟,tps怎能上去?
第一个优化点:还是基于多线程发送,当多线程共同持有一个KafkaProducer对象,这样在同一时间会有更多数据到达KafkaProducer的缓存区,Sender线程就可以实现一次发送多条消息,实现批量发送到效果,从而提升Kafka的吞吐率,实现高TPS,其效果如下图所示:
关键点:对于单个线程,由于要保证消息都顺序性,使用的是同步发送模式。
“大杀器”异步发送也能保证顺序
众所周知,在数据异构的架构体系中,通常需要将分库分表的mysql数据库中的数据同步到es,从而实现跨库join等复杂查询功能。
数据同步为了确保数据的最终一致性,通常必须保证顺序。但其维度可以为表级别、数据行级别,通常只需要保证同一行数据的不同事件(新增、更新、删除)等事件必须顺序执行,所以在上述的架构中采用的是同步发送。
有没有可能使用异步发送,但同时满足顺序语义呢?
答案当然是可以的,其设计思路为:将消息分批处理,该批次内部消息并发执行,各个批次顺序执行。示意图如下:
将消息分成批次,批次1必须要先与批次2执行,但在执行一个批次的时候,如果这个批次中的消息的key(例如id)不相同,那这批消息内部其实是无需保证其顺序的,就可以将这批消息异步发送,使每条消息并发发送,大大提高其并发度,TPS将得到进一步提升。
温馨提示:如果一个批次中的消息存在相同的key,需要将这些消息进行分割,确保一个并发批次没有重复key。
同步转异步,如果目标端是RocketMQ,其优化效果会更加显著。
好了,本文就介绍到这里了,一键三连(关注、点赞、留言)是对我最大的鼓励。
掌握一到两门java主流中间件,是敲开BAT等大厂必备的技能,送给大家一个Java中间件学习路线,助力大家实现职场的蜕变。
Java进阶之梯,成长路线与学习资料,助力突破中间件领域
最后分享笔者一个硬核的RocketMQ电子书,您将获得千亿级消息流转的运维经验。
☞B站、字节跳动等上榜2021福布斯中国最佳雇主榜;中兴发布“5G 智能T恤”:可监测呼吸;Linux 5.13 发布|极客头条☞旧手机别卖掉换脸盆了,自制服务器了解一下!
☞Windows 11 首个预览版发布,最低配置要求或降低!
Kafka 性能调优实战:同等资源配置性能提升 20 几倍的秘诀相关推荐
- Spark商业案例与性能调优实战100课》第20课:大数据性能调优的本质和Spark性能调优要点分析
Spark商业案例与性能调优实战100课>第20课:大数据性能调优的本质和Spark性能调优要点分析 基于本元想办法,大智若愚,大巧若拙!深入彻底的学习spark技术内核!
- 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...
在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...
- 从蚂蚁金服裸辞,京东三面遭调优猛击,闭关俩月啃完653页性能调优实战手册,拿到京东offer
性能优化是很多 Java 程序员希望彻底掌握的一门技能.很多人都想学好性能优化,希望能够在自己的工作中灵活运用提高性能,从而为用户提供良好的用户体验.然而,很多人在设计技术方案或者编码时缺乏系统地.方 ...
- 上线半天下载量破100W!美团大佬的Java性能调优实战手册,超详细
随着互联网的发展,高可靠.高并发以及降本增效,已成为各大公司面临的现实挑战,性能优化需求愈发迫切,大到分布式系统,小到代码块的算法优化,都已经成为你日常工作中必须要面对的事情.对于开发者而言,性能优化 ...
- jvm性能调优实战 -33每日百亿数据量的实时分析引擎,如何定位和解决频繁Full GC问题
文章目录 Pre 运行程序用的示例JVM参数 Code 基于jstat分析程序运行的状态 对JVM性能进行优化 小结 Pre jvm性能调优实战 - 27亿级数据量的实时分析引擎,为啥频繁发生Full ...
- jvm性能调优实战 - 32一个10万并发的BI系统,如何定位和解决频繁Young GC问题?
文章目录 Pre 模拟代码的JVM参数设置 示例Code 如何在windows上执行命令? 通过jstat观察程序的运行状态 Pre jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Y ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- 字节青训营第三课之高质量编程与性能调优实战的笔记和总结
这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...
- GitHub疯狂转发!阿里巴巴彩版java性能调优实战,终于到手了!文末福利
怎样才能做好性能调优? 开始之前,我先来讲一下我对性能调优的看法.在我看来Java的性能调优并不是像学习编程语言一样可以通过学习掌握,它是没有办法用直线的思维学会并掌握使用的,并且它对于程序员来说,对 ...
- 最新的阿里内部Java性能调优实战笔记,学完就能用的性能调优方法
年前的一波裁员"背刺",不少人失业,最近翻了不少网站的招聘信息,帮大家看看机会(附几张截图).上个月防疫政策放开,经济逐渐复苏,招聘市场也正在回暖,Java岗机会还是不少,大家多关 ...
最新文章
- 一天中每个小时段我都起来过,都睡过。
- python datetime计算时间差_Python中关于日期的计算总结
- Git tag 打标签
- Android的NDK开发(3)————JNI数据类型的详解
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 【文字检测算法整理】
- 产生指定长度的随机字符串
- 为什么清华、北大、麻省理工硕博士,都要逐步推导机器学习算法?
- 数据结构实验之图论七:驴友计划
- winform php 交互,WinForm开发,窗体显示和窗体传值
- 南理工计算机学院研究生课程的评价和反思(研一上)
- 前端绝对路径不显示图片_Vue cli使用绝对路径引用图片问题的解决_情愫_前端开发者...
- c语言yuv图片cb,YUV格式图像基础
- win10计算机管理如何分区,如何给win10磁盘分区?教你一招快速给win10磁盘分区的方法...
- BZOJ2794: [Poi2012]Cloakroom【偏序+背包】
- 使用 HTML5 控制摄像头摄像和拍照
- UnExpected Error, Quitting
- 佳驰电子冲刺科创板:年利润3.2亿 源峰磐钰与国家产投是股东
- 关于网线,你了解多少?
- app冷启动与热启动原理,及启动优化
热门文章
- DB2中使用Excel文件数据转CSV格式后导入数据库
- Activity之间的跳转和四种启动模式
- extjs FormPanel更改为普通表单提交,提交到iframe显示
- SecureCRT key登录linux ssh设置
- 【学习随笔】iquery初涉
- Javascript 随机验证码
- BZOJ1876 SDOI2009 SuperGCD 其他
- which 命令详解
- QQ超市模拟排配2D版1.14 (XNA4.0) (增加截图功能、新建地图功能)
- python爬虫课程设计摘要_爬虫课程设计(爬虫代码)