最经典的一道JAVA面试题:谈谈你对Kafka零拷贝原理的理解

简介: 最近一位3年工作经验的小伙伴去某厂面试,被问到这样一个问题,说:”请你简单说一下Kafka的零拷贝原理“。然后,这位小伙伴突然愣住了,什么是零拷贝,零拷贝跟Kafka有关系吗?
+关注继续查看

最近一位3年工作经验的小伙伴去某厂面试,被问到这样一个问题,说:”请你简单说一下Kafka的零拷贝原理“。然后,这位小伙伴突然愣住了,什么是零拷贝,零拷贝跟Kafka有关系吗?

那么今天,我给大家来聊一聊我对Kafka零拷贝原理的理解。

另外,我把往期分享的视频全部整理成一份500页的PDF面试题解析配套文档,希望能够以此来提高各位粉丝的通过率,

ee90d9963df444db88b33d6e798a5b94.gif

如何获取? :

扫描文章底部名片领取!

1、什么是零拷贝?

在实际应用中,如果我们需要把磁盘中的某个文件内容发送到远程服务器上,它必须要经过几个拷贝的过程,如图所示:

209c84c6fe1fd6c5694bdda2c3f6bc0d.jpg

1、从磁盘中读取目标文件内容拷贝到内核缓冲区

2、CPU控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中

3、接着在应用程序中,调用write()方法,把用户空间缓冲区中的数据拷贝到内核下的Socket Buffer中。

4、最后,把在内核模式下的SocketBuffer中的数据赋值到网卡缓冲区(NIC Buffer)

5、网卡缓冲区再把数据传输到目标服务器上。

88873212cb1ff9c4b38a1cbbe6ce91b3.jpg

在这个过程中我们可以发现,数据从磁盘到最终发送出去,要经历4次拷贝,而在这四次拷贝过程中,有两次拷贝是浪费的,分别是:

1、从内核空间赋值到用户空间

2、从用户空间再次复制到内核空间

除此之外,由于用户空间和内核空间的切换会带来CPU的上线文切换,对于CPU性能也会造成性能影响。

而零拷贝,就是把这两次多于的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不需要再经过应用程序所在的用户空间,如下图所示。

88787fa2a930ab10275aaea888ed5366.jpg

零拷贝通过DMA(Direct Memory Access)技术把文件内容复制到内核空间中的Read Buffer,

接着把包含数据位置和长度信息的文件描述符加载到Socket Buffer中,DMA引擎直接可以把数据从内核空间中传递给网卡设备。

在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了2次cpu的上下文切换,对于效率有非常大的提高。

2、Kafka零拷贝?

所以,所谓零拷贝,并不是完全没有数据赋值,只是相对于用户空间来说,不再需要进行数据拷贝。对于前面说的整个流程来说,零拷贝只是减少了不必要的拷贝次数而已。​

8be5258cbf57576da6a19bc1b093e08a.jpg

在程序中实现零拷贝的方式有三种:

1、在Linux中,零拷贝技术依赖于底层的sendfile()方法实现

2、在Java中,FileChannal.transferTo() 方法的底层调用的就是 sendfile() 方法。

3、MMAP 文件映射机制。它的原理是,将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销。

以上就是我对于Kafka中零拷贝原理的理解

本次的面试题涉及到一些计算机底层的原理,大家在平时的业务开发过程中也很少关注。但我想提醒大家,如果要在技术路上走得更远,还是要多关注一些底层的实现原理,把基础打牢固。

最后,我把往期分享的面试题全部整理成了1份10W字的文档,希望能够以此来提高各位粉丝的通过率

ee90d9963df444db88b33d6e798a5b94.gif

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!



相关文章
|
3月前
|
消息中间件 缓存 Kafka
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
24 0
|
3月前
|
消息中间件 算法 容灾
7年工作经验面试被问:谈谈你对Kafka副本Leader选举原理的理解?
一位7年工作经验的小伙伴,面试被问到这样一道题,说:”谈谈你对Kafka副本Leader选举原理的理解“。当时,他想,这Kafka用的不就是Zookeeper 的选举吗?难道Kafka又自己搞了一套。没错,这回Kafka自己造了一个轮子。 那么今天,我给大家来聊一聊我对Kafka副本Leader选举原理的理解。
44 1
|
3月前
|
消息中间件 存储 Kafka
这是面试官最想听到的回答:谈谈你对Kafka数据存储原理的理解?
一位5年工作经验的小伙伴面试的时候被问到这样一个问题,说”谈谈你对Kafka数据存储原理的理解“。然后,这位小伙伴突然愣住了,什么是零拷贝,零拷贝跟Kafka有关系吗? 那么今天,我给大家来聊一聊我对Kafka零拷贝原理的理解。
39 0
|
5月前
|
消息中间件 存储 分布式计算
分享一份京东大数据大牛私藏:Kafka核心设计与实践原理
Kafka起初是由LinkedIn 公司采用Scala语言开发的一一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Storm、Spark、Flink等都支持与Kafka集成。
|
5月前
|
消息中间件 Kafka Python
kafka关键原理及python调用kafka示例
kafka关键原理及python调用kafka示例
50 0
|
5月前
|
消息中间件 存储 负载均衡
中间件优解——RabbitMQ和Kafka的高可用集群原理
大家对当前比较常用的RabbitMQ和Kafka是否有一些了解呢,了解的多一些也不是坏事,面试或者跟人聊技术的时候也会让你更有话语权嘛。 今天就跟大家聊一聊RabbitMQ和Kafka在处理高可用集群时的原理,看看它们与RocketMQ有什么不同。小伙伴们可以重新温习一下常见的消息中间件有哪些?你们是怎么进行技术选型的?这篇文章,了解一下他们之间的区别。
|
7月前
|
消息中间件 存储 Kafka
Apache Kafka - 理解Kafka内部原理
Apache Kafka - 理解Kafka内部原理
72 0
|
8月前
|
消息中间件 存储 JavaScript
消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ
消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ
消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ
|
10月前
|
消息中间件 存储 Kafka
kafka-消息一致性--连通器原理
kafka通过多副本架构来保证数据的稳定性,这就必然会产生数据同步滞后的问题,因此保证数据一致性是一个关键因素。kafka通过连通器原理(注:连通器原理并非官方用词,是作者本人阅读时觉得和物理学的连通器原理比较相似,所以自行命名为连通器原理)的模式来保证数据的一致性。
110 0
kafka-消息一致性--连通器原理
|
11月前
|
消息中间件 缓存 运维
【Kafka原理探索】带你重新认识Kafka的生产者
【Kafka原理探索】带你重新认识Kafka的生产者
88 0
【Kafka原理探索】带你重新认识Kafka的生产者
推荐文章
更多