kafka有个很重要的特性,高速的发送和接收消息,超高的吞吐量。这里来讨论一下kafka超高的吞吐量原理:

1. 写:

页面缓存,顺序写入磁盘。
 producer  ------生产消息----->broker   
 会先将数据先写入到页面缓存(page cache)(基于MMAP)   ----刷盘---》  顺序写入到磁盘(顺序写入比随机的ssd更快)

broker基于MMAP技术,即内存映射文件,将消息先写入到操作系统的页缓存中

2. 读:

零拷贝技术
DMA将数据加载到内核缓冲区, ----sendfile 将内核缓冲区的数据直接发送。

3. partition。

一个topic可以有多个partition,并行处理数据。

4. 批量处理,数据压缩。

producer  ----------生产消息-------->broker
可以设置一定的消息数量 或者时间间隔 再发送数据。减少网络交互。
带宽压力大可以对数据进行压缩。

详细解析 读 和 写操作。

读 (消费者broker----->consumer)

零拷贝并不是说没有一次拷贝,而是减少拷贝的次数。
在消费者模型中,kafka读取消息发送消息:
传统的IO方式(4次 copy过程):
1.将磁盘------》操作系统内核缓冲区。
2.内核缓冲区------》application应用程序的buffer。			(系统调用)
3.application应用程序的buffer ------》socket网络发送缓冲区(内核缓冲区)。	(系统调用)
4.socket buffer -------》网卡(由网卡进行发送)。

java 高吞吐量接口 高吞吐量传送数据流_零拷贝


kafka io读取模型:

1.应用指定需要传输的文件句柄和调用sendfile	(系统调用)
2.操作系统在内核读取磁盘文件拷贝到页缓存。	(copy)
3.将页缓存拷贝到网卡。										(copy)

java 高吞吐量接口 高吞吐量传送数据流_零拷贝_02

MMAP

Memory Mapped Files

简称mmap,简单描述其作用就是:将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。
mmap之所以能有效提高kafka的吞吐量,是因为其在进行log文件读取的时候直接将log文件读入用户态进行缓存,绕过了内核态的page cache,避免了内核态和用户态的切换过程

参考:kafka DMA,MMAP,零拷贝