『码哥』的 Redis 系列文章有一篇讲透了 Redis 的性能优化 ——《Redis 核心篇:唯快不破的秘密》。深入地从 IO、线程、数据结构、编码等方面剖析了 Redis “快”的内部秘密。65 哥深受启发,在学习 Kafka 的过程中,发现 Kafka 也是一个性能十分优秀的中间件,遂要求『码哥』讲一讲 Kafka 性能优化方面的知识,所以『码哥』决定将这篇性能方面的博文作为 Kafka 系列的开篇之作。
先预告一下 Kafka 系列文章,大家敬请期待哦:
以讲解性能作为 Kafka 之旅的开篇之作,让我们一起来深入了解 Kafka “快”的内部秘密。你不仅可以学习到 Kafka 性能优化的各种手段,也可以提炼出各种性能优化的方法论,这些方法论也可以应用到我们自己的项目之中,助力我们写出高性能的项目。
关公战秦琼
“65: Redis 和 Kafka 完全是不同作用的中间件,有比较性吗?
”
是的,所以此文讲的不是《分布式缓存的选型》
,也不是《分布式中间件对比》
。我们聚焦于这两个不同领域的项目对性能的优化,看一看优秀项目对性能优化的通用手段,以及在针对不同场景下的特色的优化方式。
很多人学习了很多东西,了解了很多框架,但在遇到实际问题时,却常常会感觉到知识不足。这就是没有将学习到的知识体系化,没有从具体的实现中抽象出可以行之有效的方法论
。
学习开源项目很重要的一点就是归纳
,将不同项目的优秀实现总结出方法论,然后演绎
到自我的实践中去。
开篇寄语
“码哥:理性、客观、谨慎是程序员的特点,也是优点,但是很多时候我们也需要带一点感性,带一点冲动,这个时候可以帮助我们更快的做决策。「悲观者正确、乐观者成功。」希望大家都是一个乐观地解决问题的人。
”
Kafka 性能全景
从高度抽象的角度来看,性能问题逃不出下面三个方面:
-
网络
-
磁盘
-
复杂度
对于 Kafka 这种网络分布式队列来说,网络和磁盘更是优化的重中之重。针对于上面提出的抽象问题,解决方案高度抽象出来也很简单:
-
并发
-
压缩
-
批量
-
缓存
-
算法
知道了问题和思路,我们再来看看,在 Kafka 中,有哪些角色,而这些角色就是可以优化的点:
-
Producer
-
Broker
-
Consumer
是的,所有的问题,思路,优化点都已经列出来了,我们可以尽可能的细化,三个方向都可以细化,如此,所有的实现便一目了然,即使不看 Kafka 的实现,我们自己也可以想到一二点可以优化的地方。
这就是思考方式。提出问题
> 列出问题点
> 列出优化方法
> 列出具体可切入的点
> tradeoff和细化实现
。
现在,你也可以尝试自己想一想优化的点和方法,不用尽善尽美,不用管好不好实现,想一点是一点。
“65 哥:不行啊,我很笨,也很懒,你还是直接和我说吧,我白嫖比较行。
”
顺序写
“65 哥:人家 Redis 是基于纯内存的系统,你 kafka 还要读写磁盘,能比?
”
为什么说写磁盘慢?
我们不能只知道结论,而不知其所以然。要回答这个问题,就得回到在校时我们学的操作系统课程了。65 哥还留着课本吗?来,翻到讲磁盘的章节,让我们回顾一下磁盘的运行原理。
“65 哥:鬼还留着哦,课程还没上到一半书就没了。要不是考试俺眼神好,估计现在还没毕业。
”
看经典大图: