kafka请求,分2大类:
1. 控制类请求:执行特定的kafka内部动作的,比如更新leader和follower副本,leaderAndlsr请求和stopReplica请求。
2. 数据类请求:生产和消费请求,有 produce 和fetch请求。
控制类请求的优先级高于数据类请求。
处理流程如下:
1. 客户端(包括ZK,Broker,clients)把请求发到Broker上,SocketServer组件的Acceptor线程接收请求。
2. Acceptor线程:采用轮询的方式将进站请求公平的发送到所有网络线程中。
3. 网络线程池: 拿到请求后,放入到共享请求队列中。同时,网络线程池的响应队列接收IO线程处理后的response,然后由对应的网络线程把response返还给客户端。
网络线程池默认大小是3,即num.network.threads=3,表示每台Broker启动时会创建3个网络线程。
4. IO线程池:从共享请求队列中取出请求,并且执行。如果是控制类请求,执行相应的处理。如果是produce,则把消息写入到底层的磁盘日志中,如果是fetch,则从磁盘或cache中读取消息。当io线程处理完请求,会将生成的response发送到网络线程池的响应队列中。
IO线程池默认大小是8,即num.io.threads=8,表示每台Broker启动时会创建8个IO线程。
5.purgatory组件:缓存滞后延时的请求。