Kafk为什么这么快

主要基于从kafka0.11.0版本开始之后的版本进行描述

1、批处理
传统消息中间件,一次只发送单挑消息;kafka,一次发送多条消息,微批处理。

生产者发送消息,需要2次rpc:
         发送消息;
         broker返回ACK信号,表示已经接收消息;
消费者消费消息,3次rpc:
         消费者请求接收消息;
         broker返回消息;
         消费者返回ACK信号,表示已经消费

2、客户端优化
  新版客户端摒弃单线程,采用双线程模式——主线程+Sender线程。
  主线程负责将消息置入客户端缓存(缓存会将多个消息聚合为1个批次);Sender线程将缓存中聚合好的批次消息发送到Broker。

3、日志消息格式设计优良
新版本(从kafka 0.11.0版本开始)的日志消息格式,引用了变长字段Varints和ZigZag编码,有效降低了附加字段占用的空间,降低了网络传输、日志存盘占用开销。

4、消息压缩
  Kafka支持多种消息压缩方式(gzip、snappy、lz4)。对消息进行压缩可以极大地减少网络传输 量、降低网络 I/O,从而提高整体的性能。消息压缩是一种使用时间换空间的优化方式,如果对 时延有一定的要求,则不推荐对消息进行压缩。

5、分区
kafak对消息进行分区,提高了数据生产与消费的并行度,有效的提升了数据的吞吐量。

注:一昧地增加分区并不能一直带来性能的提升,详细参考[Kafka主题中的分区数越多吞吐量就越高](https://mp.weixin.qq.com/s?__biz=MzU0MzQ5MDA0Mw==&mid=2247484320&idx=1&sn=eee3caea1f28b180cf68d3469bb7d4f2&chksm=fb0be934cc7c6022cd2244ceb58b821d3fe0dc518eca1b29c4764f7d42cf2627a418bfbbf9f2&scene=21#wechat_redirect)

6、索引
kafka为每个日志分段文件提供了2个索引文件(偏移量索引文件.index、时间戳索引文件.timeindex),提高了消息的查询效率

7、顺序写盘
Kafka 在设计时采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且也不允许修改已写入的消息,这种方式属于典型的顺序写盘的操作,而操作系统可以针对线性读写做深层次的优化,比如预读(read-ahead,提前将一个比较大的磁盘块读入内存) 和后写(write-behind,将很多小的逻辑写操作合并起来组成一个大的物理写操作)技术,所以就算 Kafka 使用磁盘作为存储介质,它所能承载的吞吐量也不容小觑。

8、页缓存
  Kafka 中大量使用了页缓存,这是 Kafka 实现高吞吐的重要因素之一。
  页缓存是操作系统实现的一种主要的磁盘缓存,采用页缓存的主要优点:

   (1)减少对磁盘 I/O 的操作(具体来说,就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问)
   (2)维护页缓存和文件之间的一致性交由操作系统来负责,比进程内维护更加安全有效

8、零拷贝
Kafka使用了Zero Copy技术提升了消费的效率。前面所说的Kafka将消息先写入页缓存,如果消费者在读取消息的时候如果在页缓存中可以命中,那么可以直接从页缓存中读取,这样又节省了一次从磁盘到页缓存的copy开销。

什么是Zero-Copy?

附录:
(1)磁盘IO流程图

参考:
(1)https://mp.weixin.qq.com/s/G5nfLpPOr80pk1sHzrLuOA

原文地址:https://www.cnblogs.com/hxuhongming/p/12817378.html