通过以上文章已经把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://cloud.tencent.com/developer/article/1774592
主要通过以上几点来提升kafka吞吐量: