一、顺序读写
kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能
顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写
二、零拷贝(从磁盘到消费端)
传统流程是:
1、磁盘拷贝到OS缓冲区
2、再拷贝到应用程序缓存
3、应用程序拷贝到socket缓冲区
4、再拷贝到网卡发送
零拷贝流程:
1、磁盘拷贝到OS缓冲区
2、再直接拷贝到网卡发送
如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术”只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。
零拷贝原理:https://www.jianshu.com/p/fad3339e3448
应用程序调用mmap()
,磁盘上的数据会通过DMA
被拷贝的内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝。应用程序再调用write()
,操作系统直接将内核缓冲区的内容拷贝到socket
缓冲区中,这一切都发生在内核态,最后,socket
缓冲区再把数据发到网卡去。
三、批量发送
kafka允许进行批量发送消息,producter发送消息的时候,可以将消息缓存在本地,等到了固定条件发送到kafka
- 等消息条数到固定条数
- 一段时间发送一次
四、分区
分多个区提高并行操作能力,但不是越多越好,选Leader和同步meta信息时分区越多越慢
五、压缩
Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩
压缩的好处就是减少传输的数据量,减轻对网络传输的压力
批量发送
和数据压缩
一起使用,单条做数据压缩的话,效果不明显