持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
前言
今天是我 Kafka 学习的第 10 天,今天学习的内容是 Kafka 的协议设计。
在目前的 Kafka 2.0.0 中,一共包含了 43 种协议类型,每种协议类型都有对应的请求(Request)和响应(Response),它们都遵守特定的协议模式。每种类型的 Request 都包含相同结构的协议请求头(RequestHeader)和不同结构的协议请求体(RequestBody)。
今天我们学习的协议类型是 消息发送 的协议类型,即 ProduceRequest/ProduceResponse,对应的 api_key=0,表示 PRODUCE。
下面让我们一起来看一下。
协议结构
请求结构
协议请求头中包含 4 个域(Field):api_key、api_version、correlation_id和client_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:核心设计与实践原理》—— 朱忠华