下面我们来说一下Kafka处理请求的流程。我们知道,Producer发送消息的时候,是用的client发送到socket的,那么broker是怎么处理这些消息的呢,其实很简单,Kafka会创建一个阻塞队列接受client端发送过来的数据,然后创建处理线程来处理阻塞队列里的请求数据。
Kafka的broker处理请求是基于Reactor线程模型的,Reator线程模型有2种线程,一个是acceptor线程,用来轮询socket上的io事件,一种是processor线程,用来接受io事件并做业务处理。在Kafka中,每个broker在启动时都会创建一个acceptor线程和多个processor线程,但是processor线程并不是真正处理业务逻辑的,Kafka会为每个processor线程创建一个KafkaRequestHandler线程池,当接受到请求后,通过KafkaRequestHandler来处理业务逻辑。每个processor线程会创建一个阻塞队列,将从socket读取出来的数据放到阻塞队列中,KafkaRequestHandler分配的线程会从阻塞队列中获取数据并进行业务处理。那么Reactor线程模型的多路复用机制又是怎么在Kafka中体现的呢?可以想一下,如果每个client请求的数量远远大于processor线程的数量,难道要为每一个client请求都分配一个processor线程吗?肯定是不可以的,Kafka也用到了java nio里的selector机制,每一个processor线程都有一个selector,轮询注册在socket上的io事件,实现了多路复用机制。
下面我们来具体说一下Kafka的请求处理流程:
(1)启动acceptor线程
(2)创建多个processor线程
(3)创建KafkaRequestHandler线程池,并为每个processor线程创建一个阻塞队列
(4)broker上的acceptor线程轮询socket上的io事件,并分配给processor线程处理。
(5)processor线程接受到io事件后,将请求放到阻塞队列中,KafkaRequestHandler线程池创建的线程会从阻塞队列中取出数据并处理。processor线程将该连接注册到selector上,并监听相关的事件。
(6)当处理完请求后,KafkaRequestHandler会把返回结果放到阻塞队列中,processor线程监听到阻塞队列有新的响应,将响应结果写入到socket中。
(7)client端接收到响应结果,请求完成。
Kafka的请求处理流程就分析到这里了。
深入理解Kafka(三) 请求处理
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 文章摘要:很多人喜欢把RocketMQ与Kafka做对比,其实这两款消息队列的网络通信层还是比较相似的,本文就为大...