最近分享了《应用层私有协议的设计和实战》,对应用层私有协议设计做了一些介绍,同时也对协议设计中常用的数据类型做了比较形象的讲解,今天我们来研究一下kafka的二进制协议。
数据类型
kafka二进制协议定义了许多的数据类型,包含常用的数字、字符串,也包含了数组等类型。
本文主要讨论不可变长数据类型,可变长度(如Google Protocol Buffers)不在讨论范围内。
数据类型 |
字节长度 | 说明 |
---|---|---|
BOOLEAN |
1 |
布尔值 |
INT8 |
1 |
单字节整型,-2^7 ~ 2^7-1 |
INT16 |
2 |
双字节整型,大端序,范围 -2^15 ~ 2^15 - 1 |
INT32 |
4 |
四字节整型、大端序,范围 -2^31 ~ 2^31 - 1 |
INT64 |
8 |
八字节整型、大端序,范围 -2^63 ~ 2^63 -1 |
UINT32 |
4 |
十字街 |
UUID |
16 |
16字节,Java UUID类型 |
STRING |
2 N |
头部由2字节标识字符串长度N,后续N字节为字符串内容 |
NULLABLE_STRING | 2 N |
头部由2字节标识字符串长度N,后续N字节为字符串内容,N为-1时无后续内容 |
BYTES |
4 N |
头部4字节标识字节数组长度,后续N字节为字节数组内容 |
NULLABLE_BYTES |
4 N |
头部4字节标识字节数组长度,后续N字节为字节数组内容,N为-1时无后续内容 |
ARRAY |
4 N*M |
头部4字节标识数组长度N,M为单个数组元素的长度,N为-1时为空数组 |
错误码
- -1 未知错误
- 0 未出错
- 大于0, 具体错误
kafka内置的操作类型有点多,有兴趣的可以参阅kafka错误码
Api Keys
可以理解为操作码,服务端根据该字段区分当前请求操作。
这里不做展开,有兴趣的可以参阅kafka Api Keys
报文结构
接下来我们重点分析一下kafka的报文结构。
本文基于kafka V1版本协议写作,其他版本的研究原理时一致的。
整体结构
kafka的协议结构比较简单,请求和响应使用同样的整体结构。
RequestOrResponse => Size (RequestMessage | ResponseMessage)
Size => int32
我们转化为表格来看看