KANG's BLOG

Let's have some fun

Kafka高性能的原因

批量处理 生产者采用批量压缩后批量发送的方式,这一批消息会被当做一个"批消息"直接由broker处理包括分发、复制、刷盘,然后发送到消费者,由消费者去分解为一条条的数据再去处理。其中broker不需要对这一批消息进行拆解处理。这样不仅减轻了broker的压力,最关重要是减少了生产和消费的交互次数。 利用PageCache加速消息读写 我们的系统读取硬盘上的数据时,并不是直接与硬盘交互,而是操作系统会将数据缓存在内存中的PageCache里,基于内存和硬盘的性能差,能最大化读写性能,当应用程序读取PageCache中数据未命中时,会触发“缺页中断”,此时应用程序的读取线程会被阻塞,操作系统把数据从文件复制到PageCache中,然后应用程序再从PageCache中继续读取数据,这时由于触发了硬盘IO,所以性能较差。 但是,操作系统对于PageCache使用后并不会直接删除,只有在内存不够用时,才会基于LRU或其他变种算法清除。 Kafka的业务属性就是不断消费刚刚写入消息,而这些新的消息不会被LRU算法优先清除,所以读取时,命中PageCache几率会非常高。 顺序读写提升磁盘IO性能 kafka充分利用磁盘顺序读写性能较好的特性来设计存储结构,它把从Producer收到的消息,顺序写入对应的log文件中,一个文件写满了,就开启一个新的文件顺序写下去。消费的时候,也是从某个log的某个位置开始,顺序读出来。 零拷贝( zero-copy ) 发送数据,通常需要通过如下几步: