通过以上文章已经把kafka基本概念整理了一下,从生产者到Broker消费者。下面来简单总结一下,为什么kafka能做到这么高的吞吐。
MQ的消息存储有几种选择,一种是内存,如ZeroMQ,速度很快但是不可靠。一种是第三方的数据库,会产生额外的网络消耗,而且数据库出问题会影响存储。所以最常见的是把数据放到磁盘上存储。
但我们也知道,磁盘的I/O是比较慢的,选择磁盘做为存储怎么实现高吞吐、低延迟、高性能的呢?
(案例显示在普通服务器上可以达到百万级TPS)
总结起来主要有4点:磁盘顺序I/O、索引机制、批量操作和压缩、零拷贝。
顺序读写
在之前讲mysql存储时提到了一种思路,写数据文件data file,和用来做崩溃恢复的redo log,区别在哪?
顺序I/O和随机I/O。
Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入,这使得Kafka写入吞吐量得到了显著提升。
内存I/O是不是一定比磁盘I/O快呢?
在本篇文章中有做了对比:
https://queue.acm.org/detail.cfm?id=1563874
这张图片现实,在一定条件下测试,磁盘顺序读写可以达到53.2M每秒,比内存的随机读写要快。
索引
时间索引与offset索引
批量读写和文件压缩
kafka把所有消息都变成一个批量的文件,并进行合理的批量压缩,减少网络IO损耗。
零拷贝
详情可参考:https://my.oschina.net/u/1019754/blog/4897381
主要通过以上几点来提升kafka吞吐量:
- 从磁盘读取(顺序I/O)
- 搜索查找(索引)
- 批量读写和数据压缩
- 调整网络I/O方式。