Kafka 进阶学习(十)—— 协议设计

355 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

前言

今天是我 Kafka 学习的第 10 天,今天学习的内容是 Kafka 的协议设计。

在目前的 Kafka 2.0.0 中,一共包含了 43 种协议类型,每种协议类型都有对应的请求(Request)和响应(Response),它们都遵守特定的协议模式。每种类型的 Request 都包含相同结构的协议请求头(RequestHeader)和不同结构的协议请求体(RequestBody)。

今天我们学习的协议类型是 消息发送 的协议类型,即 ProduceRequest/ProduceResponse,对应的 api_key=0,表示 PRODUCE。

下面让我们一起来看一下。

协议结构

请求结构

协议请求头中包含 4 个域(Field):api_keyapi_versioncorrelation_idclient_id,其含义如下:

  • api_key:API 标识,比如 PRODUCE、FETCH 等分别表示发送消息和拉取消息的请求;
  • api_version:API 版本号;
  • correlation_id:由客户端指定的一个数字来唯一标识这次请求的 ID,服务端在处理完请求后也会把同样的 correlation_id 写到 Response 中,这样客户端就能把某个请求和响应对应起来了;
  • client_id:客户端 ID;

协议请求体中各个域含义如下:

  • transction_id:事务 ID,从 Kafka 0.11.0 开始支持事务,如果不使用事务的功能,那么该域的值为 NULL;

  • acks:对应客户端参数 acks;

  • timeout:请求超时时间,对应客户端参数 request.timeout.ms,默认值为 30000,即 30 秒;

  • topic data:array 类型,代表 ProduceRequest 中所要发送的数据集合。以主体名称分类,主题中再以分区分类;

    • topic:主体名称

    • data:array 类型,与主题对应对的数据

      • patition:分区编号
      • record_set:与分区对应的数据

响应结构

协议响应头中只有一个 correlation_id

除了响应头中的 correlation_id,其余 ProduceResponse 各个域的字段如下:

  • throttle_time_ms:如果超过了配额(quota)限制则需要延迟该请求的处理时间。如果没有配置配额,那么该字段的值为 0;

  • response:该字段类型为 array,代表 ProduceResponse 中要返回的数据集合,同样按照主题分区的粒度进行划分;

    • topic:主体名称

    • patition_response:array 类型,主题中所有分区的响应

      • patition:分区编号
      • error_code:错误码,用来标识错误类型,目前版本的错误码有 74 种;
      • base_offset:消息集的起始偏移量
      • log_append_time:消息写入 broker 端的时间
      • log_start_offset:所在分区的起始偏移量;

消息追加是针对单个分区而言的,那么响应也是针对分区粒度来进行划分的,这样 ProduceRequest 和 ProduceResponse 做到了一一对应。

参考文档

  • 《深入理解 Kafka:核心设计与实践原理》—— 朱忠华

往期文章