深入理解Kafka(三) 请求处理

下面我们来说一下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(三) 请求处理)