通过以上文章已经把kafka基本概念整理了一下,从生产者到Broker消费者。下面来简单总结一下,为什么kafka能做到这么高的吞吐。

MQ的消息存储有几种选择,一种是内存,如ZeroMQ,速度很快但是不可靠。一种是第三方的数据库,会产生额外的网络消耗,而且数据库出问题会影响存储。所以最常见的是把数据放到磁盘上存储。

但我们也知道,磁盘的I/O是比较慢的,选择磁盘做为存储怎么实现高吞吐、低延迟、高性能的呢?

(案例显示在普通服务器上可以达到百万级TPS)

https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

总结起来主要有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

Kafka 为什么快?(5)-LMLPHP

这张图片现实,在一定条件下测试,磁盘顺序读写可以达到53.2M每秒,比内存的随机读写要快。

索引

时间索引与offset索引

批量读写和文件压缩

kafka把所有消息都变成一个批量的文件,并进行合理的批量压缩,减少网络IO损耗。

零拷贝

详情可参考:https://my.oschina.net/u/1019754/blog/4897381

主要通过以上几点来提升kafka吞吐量:

  • 从磁盘读取(顺序I/O)
  • 搜索查找(索引)
  • 批量读写和数据压缩
  • 调整网络I/O方式。
04-13 08:24