Kafka为什么这么快? 为何卡夫卡如此迅猛?(3)
Kafka为什么这么快

我们将副本数从四减少到三,并且这些副本中只有一个涉及 CPU。
我们还将上下文切换的数量从四个减少到了两个。这是一个很大的改进,但是还没有查询零副本。
当运行 Linux 内核 2.4 及更高版本以及支持收集操作的网络接口卡时,后者可以作为进一步的优化来实现。
如下所示。

根据前面的示例,调用transferTo()方法会使设备通过 DMA 引擎将数据读取到内核读取缓冲区中。
但是,使用gather操作时,读取缓冲区和套接字缓冲区之间没有复制。
取而代之的是,给 NIC 一个指向读取缓冲区的指针以及偏移量和长度,该偏移量和长度由 DMA 清除。
CPU 绝对不参与复制缓冲区。
关于零拷贝详情,可以详读这篇文章零拷贝 (Zero-copy) 浅析及其应用。
PageCache

producer 生产消息到 Broker 时,Broker 会使用 pwrite() 系统调用【对应到 Java NIO 的 FileChannel.write() API】按偏移量写入数据,此时数据都会先写入page cache。consumer 消费消息时,Broker 使用 sendfile() 系统调用【对应 FileChannel.transferTo() API】,零拷贝地将数据从 page cache 传输到 broker 的 Socket buffer,再通过网络传输。
leader 与 follower 之间的同步,与上面 consumer 消费数据的过程是同理的。
page cache中的数据会随着内核中 flusher 线程的调度以及对 sync()/fsync() 的调用写回到磁盘,就算进程崩溃,也不用担心数据丢失。另外,如果 consumer 要消费的消息不在page cache里,才会去磁盘读取,并且会顺便预读出一些相邻的块放入 page cache,以方便下一次读取。
因此如果 Kafka producer 的生产速率与 consumer 的消费速率相差不大,那么就能几乎只靠对 broker page cache 的读写完成整个生产 – 消费过程,磁盘访问非常少。
网络模型
★
同学:网络嘛,作为 Java 程序员,自然是 Netty
是的,Netty 是 JVM 领域一个优秀的网络框架,提供了高性能的网络服务。大多数 Java 程序员提到网络框架,首先想到的就是 Netty。Dubbo、Avro-RPC 等等优秀的框架都使用 Netty 作为底层的网络通信框架。
Kafka 自己实现了网络模型做 RPC。底层基于 Java NIO,采用和 Netty 一样的 Reactor 线程模型。
相关阅读
-
创建网站需要多少钱 建网站需要的费用
文章摘要:创建网站需要多少钱和建网站需要的费用的相关经验,接下来IT袋小编就来介绍。 随着现代社会的发展,制作网站的门槛是越来越低,现在有开源的程序,会打字就可以建设一个网
-
Spring AOP/IOC实现原理
正文核心介绍:Spring的内容,一起跟随小编看看吧! AOP 什么是AOP 通俗的讲就是当你想要实现对象增强,就可以使用AOP。 不然的话还需要自己创建代理,AOP就是为了解决 非业务代码抽取 的
-
域名和ip地址是如何对映的 域名与IP地址的映射机制解析
本文摘要:域名和ip地址是如何对映的的IT小经验,下面小编为您详细解答 主要通过DNS域名解析来完成的。 域名解析的工作流程: 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并
-
动态网站开发与设计 html网页制作动态效果
小编为你讲解动态网站开发与设计和html网页制作动态效果的相关经验,一起跟随小编看看吧! 细节部分如页面的访问速度,客户的使用反馈和交流,内容的更新等都对于用户来说能够起到不小


