KafkaApis类中有个handle函数,这里是消息分发中心,根据request中的requestId采用不同的处理方式。当requestId == RequestKeys.produceKey
时,通过函数handleProducerOrOffsetCommitRequest
处理request。
这个函数中把ProducerRequest和OffsetCommitRequest请求都作为生产消息进行处理。
//如果requestId == OffsetCommitKey,则该请求是 offsetCommitReqeust,否则是produceRequest
val (produceRequest, offsetCommitRequestOpt) =
if (request.requestId == RequestKeys.OffsetCommitKey) {
val offsetCommitRequest = request.requestObj.asInstanceOf[OffsetCommitRequest]
OffsetCommitRequest.changeInvalidTimeToCurrentTime(offsetCommitRequest)
//如果是offsetCommitRequest,根据commit的topic,partition,groupId生成一个请求
(producerRequestFromOffsetCommit(offsetCommitRequest), Some(offsetCommitRequest))
} else {
(request.requestObj.asInstanceOf[ProducerRequest], None)
}
producerRequestFromOffsetCommit函数根据offsetCommitRequest构造出相应的ProducerRequest:consumer提交消费进度时,根据groupId映射到相应的partition,向partition的leader发送offsetCommitReuqest,其中包含(topicAndPartition,offset)的键值对;根据groupId,topicAndPartition生成key,offset作为bytes组合成一条Message,并返回以该message作为data的ProducerRequest。所以,Off