2、kafka为何能实现每秒几十万的吞吐量

2022-04-08  本文已影响0人  松松木tell

Kafka是高吞吐量低延迟的高并发、高性能的消息中间件,在大数据领域有广泛的应用。那他是如何做到这么高的吞吐量和高性能呢?

一、生产者提高吞吐量

生产者通过多batch合并一个request 一次性发送broker提高吞吐量
每个Kafka服务端叫做一个broker,负责管理一台机器上的数据;每个topic拆分成多个partition,这样每个partition存储一部分数据并放在不同的broker上。这时候生产者如果生产一条消息,就建立连接然后发送数据,效率肯定不高。

image.png

1.多条消息打包成一个batch

Kafka会在生产者放一个内存缓冲区,当生产消息后,它会把同一个topic同一个partition的消息打包成一个batch。

2.多个batch合并成一个request

这样就结束了吗?当然不是,如果生产者这边有多个topic,不同topic发送到同一个broker的数据是否可以合并呢?当然可以
如果客户端那边有2个topic,每个topic有个3个partition,那每个broker就会有2个partition。这时候我们完全可以将发送到同一个broker的batch一次发送。所以kafka将发送到同一个broker的batch打包成一个request发送,进一步提高了通信的效率。

二、kafka内部机制

1.页缓存技术

首先kafka在接收到数据后都会写磁盘,但是我们都知道写磁盘性能会很差,所以它并不是直接写磁盘。操作系统本身有一层缓存叫做页缓存,相当于内存,所以kafka是把数据写入到页缓存中,接下来由页缓存决定什么时候写入到磁盘。

2.磁盘顺序写

普通机械磁盘如果随机写的话,性能会非常差,Kafka采用磁盘顺序写的方式,仅仅将数据追加到文件末尾,这种方式性能基本可以和内存媲美。

三、kafka分发提高吞吐量

上面说的是kafka写入数据的优秀设计,那从磁盘读数据分发又是如何设计的呢?

1.零拷贝技术

我们可以想想分发数据一般是如何做的。首先肯定是从磁盘中读出数据到页缓存,然后从页缓存中拷贝到kafka中,然后再从kafka中拷贝到socket中,最后再给网卡。
而零拷贝技术,就是去除上面2步拷贝,直接从页缓存中将数据发送到网卡中,socket中仅仅只是拷贝一个描述符,这个过程大大提升了读取的性能。而且从磁盘读数据时候会先看看页缓存中有没有,如果有的话都不用读磁盘了。

上一篇下一篇

猜你喜欢

热点阅读