简介
Kafka使用基于TCP的二进制协议,该协议定义了所有API的请求及响应消息。所有的消息都是通过长度来分隔,并且由后面描述的基本类型组成。
基本数据类型
- 定长基本类型
int8/int16/int32/int64这些都是不同精度的带符号整数,以大端(big endian)方式存储。 - 变长基本类型
这些类型由一个表示长度的带符号整数N以及后续N字节的内容组成,长度如果为-1则表示空。
string使用int16表示长度,bytes使用int32表示长度。 - 数组
这个类型用来处理重复的结构体数据,它们总是由一个代表元素个数int32的整数N,以及后续N个重复结构体组成。
这些结构体自身是由其他的基本数据类型组成。
通用的请求和响应格式
- 所有请求和响应都遵循以下语法基础:
RequestOrResponse --> Size( RequestMessage | ResponseMessage )
Size --> int32
Size给出了后续请求或响应消息的字节长度。
解析时应先读取4字节的长度N,然后读取并解析后续的N字节请求/响应内容。
- 所有请求都具有以下格式:
RequestMessage --> request_header request
request_header --> api_key api_version correlation_id client_id
api_key --> int16
api_version --> int16
correlation_id -->int32
client_id --> string
request --> MetadataRequest | ProduceRequest | FetchRequest | ...
api_key: 这是一个表示所调用的API的数字ID(即不同类型的请求有不同的ID)
api_version: 这是该API的一个数字版本号,Kafka为每个API定义一个版本号,该版本号允许服务器根据版本号正确地解释请求内容。
correlation_id: 这是一个用户提供的整数。它将被服务器原封不动的传回给客户端。用于匹配客户端和服务器之间的请求和响应。
client_idÿ