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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2、kafka为何能实现每秒几十万的吞吐量相关的知识,希望对你有一定的参考价值。

参考技术A

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

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

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

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

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

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

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

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

以上是关于2、kafka为何能实现每秒几十万的吞吐量的主要内容,如果未能解决你的问题,请参考以下文章

面试官:消息中间件如何实现每秒几十万的高并发写入?石杉的架构笔记

Kafka基础

kafka的认识,安装zookeeper,kafka

Kafka如何保证百万级写入速度 并 保证不丢失不重复消费

认识kafka

腾讯资深技术官23天手撸笔记,全新演绎“Kafka部署实战”,已开源下载