在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
本篇文章我们将从Kafka的客户端缓冲机制开始,一直分析到内存缓冲造成的频繁GC问题,最后谈谈Kafka设计者实现的缓冲池机制,希望解决大多数人对Kafka缓冲机制的疑问。
1、Kafka的客户端缓冲机制
在客户端发送消息给kafka服务器的时候,一定是有一个内存缓冲机制的。也就是说,消息会先写入一个内存缓冲中,然后直到多条消息组成了一个Batch,才会一次网络通信把Batch发送过去。
2、内存缓冲造成的频繁GC问题
这种内存缓冲机制的本意,其实就是把多条消息组成一个Batch,一次网络请求就是一个Batch或者多个Batch。这样每次网络请求都可以发送很多数据过去,避免了一条消息一次网络请求。从而提升了吞吐量,即单位时间内发送的数据量。
但是问题来了,大家可以思考一下,一个Batch中的数据,会取出来然后封装在底层的网络包里,通过网络发送出去到达Kafka服务器。这个Batch里的数据都发送过去了,现在Batch里的数据应该怎么处理?这些Batch里的数据此时可还在客户端的JVM的内存里啊!那么此时从代码实现层面,一定会尝试避免任何变量去引用这些Batch对应的数据,然后尝试触发JVM自动回收掉这些内存垃圾。
这样不断的让JVM回收垃圾,就可以不断的清理掉已经发送成功的Batch了,然后就可以不断的腾出来新的内存空间让后面新的数据来使用。这种想法很好,但是实际线上运行的时候一定会有问题,最大的问题,就是JVM GC问题。JVM GC在回收内存垃圾的时候,他会有一个“Stop the World”的过程,也就是垃圾回收线程运行的时候,会导致其他工作线程短暂的停顿,这样可以便于他自己安安静静的回收内存垃圾。
这个也很容易想明白,毕竟你要是在回收内存垃圾的时候,你的工作线程还在不断的往内存里写数据,制造更多的内存垃圾,那你让人家JVM怎么回收垃圾?这就好比在大马路上,如果地上有很多垃圾,现在要把垃圾都扫干净,最好的办法是什么?大家都让开,把马路空出来,然后清洁工就是把垃圾清理干净。但是如果清洁工在清扫垃圾的时候,结果一帮人在旁边不停的嗑瓜子扔瓜子壳,吃西瓜扔西瓜皮,不停的制造垃圾,你觉得清洁工内心啥感受?当然是很愤慨了,照这么搞,地上的垃圾永远的都搞不干净了!
现在JVM GC是越来越先进,从CMS垃圾回收器到G1垃圾回收器,核心的目标之一就是不断的缩减垃圾回收的时候,导致其他工作线程停顿的时间。所以现在越是新款的垃圾回收器导致工作线程停顿的时间越短,但是再怎么短,他也还是存在啊!而如何尽可能在自己的设计上避免JVM频繁的GC就是一个非常考验水平的事儿了。
3、Kafka设计者实现的缓冲池机制
在Kafka客户端内部,对这个问题实现了一个非常优秀的机制,就是缓冲池的机制。每个Batch底层都对应一块内存空间,这个内存空间就是专门用来存放写入进去的消息的。然后当一个Batch被发送到了kafka服务器,这个Batch的数据不再需要了,就意味着这个Batch的内存空间不再使用了。此时这个Batch底层的内存空间不要交给JVM去垃圾回收,而是把这块内存空间给放入一个缓冲池里。这个缓冲池里放了很多块内存空间,下次如果你又有一个新的Batch了,那么不就可以直接从这个缓冲池里获取一块内存空间就ok了?然后如果一个Batch发送出去了之后,再把内存空间给人家还回来不就好了?以此类推,循环往复。
以上就是小编对Kafka缓冲机制的内容讲解,希望能给大家一些帮助。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
自动化运维要学习哪些内容?如何才能学会自动化运维?
由于运维知识对于零基础人员来说,更容易掌握,所以很多人纷纷进入到运维的岗位。殊不知因为自动化运维的发展以及普遍应用,基础运维人员也需要学习编程开发的知识。不懂开发的运维工程师也许未来就会被淘汰。那对于自动化运维而言,需要学习那些内容?如何才能学会自动化运维呢?
20509
2019-06-19 17:46:29
有什么好的解压缩软件?OS X下五款软件推荐
如今,在每一人的工作中都难免使用到解压缩软件。那么有什么好的解压缩软件呢?毕竟一款好的压缩软件既可以节省时间和内存,还能提高工作效率。本文就给大家推荐五款OS X下的解压缩软件。
7552
2019-08-08 15:32:21
什么是系统运维?运维工程师要掌握哪些技能?
回首过去的二十多年,不得不感慨互联网技术的飞跃发展。而信息技术的每一次革新,都是依靠着系统运维的支撑。运维作为技术岗位最不为人知的幕后英雄,是网络系统正常运行的有力保障。那么什么是系统运维呢?运维工程师要掌握哪些技能呢?
14234
2019-09-25 10:56:41
应届生运维面试需要做什么准备?
应届生运维面试需要做什么准备?首要工作就是要准备好自己的简历,别小看简历的制作,里面有许多让你能从众多求职者中,脱颖而出的小技巧。然后是多刷面试题,模拟面试官的面试场景。只有做足了充分的准备,才能在运维面试的时候,充分展示自己的能力。下面我们来看看,针对面试各个环节的相应准备吧!
9178
2019-10-11 19:46:25
如何学习嵌入式硬件?
学习嵌入式硬件需要有一定的硬件基础,熟练使用一种原理图PCB绘制,软件熟练掌握各种元器件的原理及电气特性,并依据此综合特性、成本、供应等各个方面进行器件选型等。硬件学习的范围很大,你需要学习的知识有很多,需要了解的面也有很多。
4999
2020-06-11 16:01:01