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 -------》网卡(由网卡进行发送)。
kafka io读取模型:
1.应用指定需要传输的文件句柄和调用sendfile (系统调用)
2.操作系统在内核读取磁盘文件拷贝到页缓存。 (copy)
3.将页缓存拷贝到网卡。 (copy)
MMAP
Memory Mapped Files
简称mmap,简单描述其作用就是:将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。
mmap之所以能有效提高kafka的吞吐量,是因为其在进行log文件读取的时候直接将log文件读入用户态进行缓存,绕过了内核态的page cache,避免了内核态和用户态的切换过程