Kafka作为一个消息队列,有其自己定义消息的格式。Kafka中的消息采用ByteBuf,之所以采用ByteBuf这种紧密的二进制存储格式是因为这样可以节省大量的空间。毕竟如果使用Java类的格式来定义消息对象将会浪费大量的空间(Java对象除了本身属性所占的空间外,还存在一些Header,还会存在一些补齐)。
Kafka的消息格式经历了V0、V1以及V2版本。V0没有时间戳的字段,导致很难对过期的消息进行判断。V0、V1存在很多固定长度的字段,这些字段在实际中往往占用很少,造成浪费,因此V2将其中的很多定义长度的字段设计成可变长度。
可变长度的设计借鉴了Zig-zag编码格式,最高位用来表示当前字节是否已经是某个数编码的最后一个字节(1代表不是,0代表是)。
一个消息批次包含若干个消息组成,其实Kafka的日志文件就是用若干个消息批次组成的,kafka不是直接在消息层面上操作的,它总是在消息批次层面上进行写入。