kafka为什么这么快?

kafka高吞吐的原因?

kafka是分布式消息系统,需要处理海量的消息,
Kafka的设计是把所有的消息都写入速度低容量大的硬盘,
以此来换取更强大的存储能力,
但实际上,使用硬盘并没有带来过多的性能损失。
kafka主要使用了以下几种方式实现了超高的吞吐率。

1.顺序读写磁盘

kafka的消息(msg)是不断追加到文件中的,这个特性使Kafka可以充分利用磁盘顺序读写性能,顺序读写不需要磁盘磁头的寻道时间,只需要很少的扇区旋转时间,所以速度远快于随机读写
在这里插入图片描述kafka官方给出了测试数据 (Raid-5,7200rpm):
顺序 I/O:600MB/S
随机 I/O: 100KB/S

2.零拷贝

	涉及到零拷贝之前,先简单了解下文件系统的操作流程,
	例如一个程序要把文件内容发送到网络。
	这个程序是工作在用户空间,
	文件和网络socket属于硬件资源,
	两者之间有一个内核空间。
	在操作系统内部,整个过程为:

在这里插入图片描述 在Linux kernel2.2之后出现了一种叫做“零拷贝(zero-coy)”系统调用机制,数据并不再复制到“用户态缓冲区”。
系统上下文切换减少为两次,可以提升一倍的性能,具体如下图:
在这里插入图片描述

3.文件分段

	在kafka中tpoic是逻辑的概念,
	真实存在的是组成topic的各个partition,
	而partition又被分为多个segement,
	所以kafka队列中的消息实际上是保存在N多个segement中。

在这里插入图片描述
通过文件分段的方式,每次文件操作都是对一个小文件的操作,非常轻便,同时也增加了并行处理能力。

4.批量发送

kafka允许进行批量发送消息,先将消息缓存在内存中,
然后一次请求批量发送出去,
将数据flush到磁盘(partition的segement)文件,
**比如可以指定缓存的消息达到某一个量的时候就发出去,
或者缓存了固定的时间后就发送出去,
如100条消息就发送,或者每5秒发送一次,
这种策略将大大减少服务端的I/O次数

(Message)消息flush到磁盘上,flush策略,以下两个参数在server.properties文件中
log.flush.interval.messages=
log.flush.interval.ms=

5.数据压缩

Kafka 还支持对消息集合进行压缩,Producer 可以通过 GZIP 或 Snappy 格式对消息集合进行压缩,压缩的好处就是减少传输的数据量,减轻对网络传输的压力,Producer 压缩之后,在 Consumer 需进行解压,虽然增加了 CPU 的工作,但在对大数据处理上,瓶颈在网络上而不是 CPU,所以这个成本很值得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值