apache kafka系列之源码分析走读-kafkaApi详解

Kafka源码中数据交互流程


图1

1.概述

kafka启动时做很多初始化运行环境工作,具体请参考:apache kafka系列之源码分析走读-kafka内部模块分析

其中SockeServer类启动时,首先初始化NIO网络环境、启动监听、创建主线程、工作线程池、设置参数等等。

从上图1中可以看到整个交互过程中,kafka的所有逻辑处理和交互实际是交给KafkaApi类来处理的。

通过请求的类型,把具体的request路由到对应的handler处理。目前kafka并没有把handler抽象出来,

而是每个handler都是一个函数,混在KafkaApi类中。

2. Request请求类别

kafka-0.8.1版本中定义了10种类型请求,请求类型说明如下:

参数

说明(解释)

请求二进制数据解码类

RequestKeys.ProduceKey

producer请求

ProducerRequest

RequestKeys.FetchKey

consumer请求

FetchRequest

RequestKeys.OffsetsKey

topicoffset请求

OffsetRequest

RequestKeys.MetadataKey

topic元数据请求

TopicMetadataRequest

RequestKeys.LeaderAndIsrKey

leaderisr信息更新请求

LeaderAndIsrRequest

RequestKeys.StopReplicaKey

停止replica请求

StopReplicaRequest

RequestKeys.UpdateMetadataKey

更新元数据请求

UpdateMetadataRequest

RequestKeys.ControlledShutdownKey

controlledShutdown请求

ControlledShutdownRequest

RequestKeys.OffsetCommitKey

commitOffset请求

OffsetCommitRequest

RequestKeys.OffsetFetchKey

consumeroffset请求

OffsetFetchRequest


下面是KafkaApi中handle方法代码:

[java]  view plain  copy
  1. def handle(request: RequestChannel.Request) {  
  2.   try{  
  3.     trace("Handling request: " + request.requestObj + " from client: " + request.remoteAddress)  
  4.     request.requestId match {  
  5.       case RequestKeys.ProduceKey => handleProducerRequest(request)  // producer  
  6.       case RequestKeys.FetchKey => handleFetchRequest(request)       // consumer  
  7.       case RequestKeys.OffsetsKey => handleOffsetRequest(request)  
  8.       case RequestKeys.MetadataKey => handleTopicMetadataRequest(request)  
  9.       case RequestKeys.LeaderAndIsrKey => handleLeaderAndIsrRequest(request) //成为leader或follower设置同步副本组信息  
  10.       case RequestKeys.StopReplicaKey => handleStopReplicaRequest(request)  
  11.       case RequestKeys.UpdateMetadataKey => handleUpdateMetadataRequest(request)  
  12.       case RequestKeys.ControlledShutdownKey => handleControlledShutdownRequest(request)  //shutdown broker  
  13.       case RequestKeys.OffsetCommitKey => handleOffsetCommitRequest(request)  
  14.       case RequestKeys.OffsetFetchKey => handleOffsetFetchRequest(request)  
  15.       case requestId => throw new KafkaException("Unknown api code " + requestId)  
  16.     }  
  17.   } catch {  
  18.     case e: Throwable =>  
  19.       request.requestObj.handleError(e, requestChannel, request)  
  20.       error("error when handling request %s".format(request.requestObj), e)  
  21.   } finally  
  22.     request.apiLocalCompleteTimeMs = SystemTime.milliseconds  
  23. }  

3.请求交互二进制数据格式

kafka中客户端与server端交互有多种类型,那它是怎么交互数据呢,格式是怎样?下面来揭开面纱。
请求交互二进制数据 组成为:请求类型 + 请求数据。

3.1 ProducerRequest二进制格式


3.2 FetchRequest二进制格式


3.3 OffsetRequest二进制格式


3.4 TopicMetadataRequest二进制格式


3.5 LeaderAndIsrRequest二进制格式


3.6 StopReplicaRequest二进制格式


3.7 UpdateMetadataRequest二进制格式


3.8 ControlledShutdownRequest二进制格式


3.9 OffsetCommitRequest二进制格式


3.10 OffsetFetchRequest二进制格式



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值