kafka是怎么把消息写入磁盘,又把磁盘的消息拿出来发给用户进程的
讲解下kafka是怎么把消息写到磁盘,怎么把消息从磁盘上拿走发给客户端的,看下图,这里用到了mmap,零拷贝的知识。
消息存储:
客户端c发来了消息,正常流程来讲这条消息是先到kernal内核中的,kafka先要把消息读取到自己里面来做个数据的加工的,然后在写道kernal上,keranal在输出到磁盘上的,看见没有这经历了好几次过成的。这时候mmap来了,kafka和磁盘直接建立通道就是mmap,有消息过来好kafak通过epol事件驱动就会知道的,消息处理完之后直接写入到mmap,过来一消息追加下。。。。,这些消息直接写入到磁盘的segment文件中,写满了这个mmap就关掉重新在搞一个,在直接写入到segment上。
消息消费:
有客户端要消费消息了,正常流程来讲这个请求也是先打到kernal内核上,kafaka写发起个read到kernal上,keranl发起read到磁盘segment上,kafka拿到消息后在write到kernal上,最后在到消费端的进程上去,这也经历了好几步骤,因为消费的时候kafka不需要对数据进行加工,相当于直接把磁盘上的数据丢给消费进程就可以了。这时候用了零拷贝sendFile节约了好几步。kafka直接给keranl内核发送要调用sendfile的命令,内核直接把数据从磁盘上读出来后直接把消息丢给客户端的进程就可以了。