天天看點

【Kafka源碼】處理請求一、KafkaRequestHandlerPool二、KafkaApis.handle三、Request資料結構

[TOC]

在KafkaServer中的入口在:

首先根據相關參數,執行個體化KafkaApis,然後執行個體化KafkaRequestHandlerPool。下面我們首先看下KafkaRequestHandlerPool。

主要是啟動了numThreads個數的線程,然後線程中執行的内容是KafkaRequestHandler。

在run方法中,我們可以看到,主要處理消息的地方是api.handle(req)。下面我們主要看下這塊的内容。

直接看代碼:

這塊比較簡單,主要的是Request的資料結構,還有後續的處理方法。下面我們逐漸來分析。

所有的請求,最終都會變成這個RequestChannel.Request。是以我們先看下這個Request。

主要有幾個部分,

首先是requestId,是一個short類型的值。

然後是header,即消息頭,是一個RequestHeader

最後是body,是消息的内容,類型為AbstractRequest

這個requestId表示的是api的類型,KafkaApis需要根據這個requestId,來判斷調用哪個方法處理消息。

我們看下RequestHeader的結構。

主要是四個變量,apiKey,APIVersion,clientId,correlationId。

消息體,對應的類為AbstractRequest。主要的内容是根據版本号和apiKey來解析出消息的具體内容。

這塊的請求類型很多,想要了解具體結構的,可以到每個類中具體看。

繼續閱讀