Kafka 偏移量的演变

1、Kafka 0.7.x 消息格式

(1)magic:这个占用1个字节,主要用于标识 Kafka 版本。这个版本的 Kafka magic有 0 和 1 两个值,不过默认 Message 使用的是 1;

(2)attributes:占用1个字节,这里面存储了消息压缩使用的编码。这个版本的 Kafka 仅支持 gzip 和 snappy 两种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0000则表示没有使用压缩。

(3)crc:占用4个字节,主要用于校验消息的内容,也就是上图的Value。

(4)value:这个占用的字节为 N - 6,N为Message总字节数,6就是前面几个属性占用的字节和。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

一个 MessageSet 包含多条消息,其中:

(1)offset:占用8个字节,这个是 Kafka 消息存储到磁盘之后的物理偏移量;

(2)size:占用4个字节,这是消息的大小。

(3)message:占用N个字节,这个就是上图的Message,格式见Message Format。

需要注意的是, Kafka 从 Producer 发送到 Broker 是以 MessageSet 为单位发送的,而不是以 Message 发送的。而且压缩的时候也是以 MessageSet 进行压缩的,并不是只压缩一条消息,这样做的目的是提高效率。压缩之后的消息格式如下:

压缩之后的内容作为另外一条消息的内容进行存储,其中包含了多条消息。

2、Kafka 0.8.x (0.9.x) 消息格式

到了Kafka 0.8.0,消息格式变化了,相对于Kafka 0.7.x加入了几个字段,主要如下:

这个版本的 Message 格式加入了 Key 相关的信息,以及 内容的长度等,各个字段的含义介绍如下:

(1)crc:占用4个字节,主要用于校验消息的内容;

(2)magic:这个占用1个字节,主要用于标识 Kafka 版本。

(3)attributes:占用1个字节,这里面存储了消息压缩使用的编码。这个版本的 Kafka 仅支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0011则是snappy压缩,如果是0000则表示没有使用压缩。

(4)key length:占用4个字节。主要标识 Key 的内容的长度 K;

(5)key:占用 K 个字节。存储的是 key 的具体内容

(6)value length:占用4个字节。主要标识 value 的内容的长度 V;

(7)value:这个占用的字节为 V。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

这个版本的MessageSet 格式和之前一样,就不介绍了。但是需要注意的是,这个版本 MessageSet 中的 offset 字段存储的已经不是消息物理偏移量了,而是逻辑地址,比如0,、1、2....

我们在上面说了 Kafka 压缩的时候是将整个 MessageSet 进行压缩的,压缩完之后的内容作为另外一个 Message 的 value,如下:

压缩消息的格式和非压缩格式的消息不一样,少了 Key 的存储空间,而且这时候消息的 value 为压缩之后的消息内容。

3、Kafka 0.10.x 消息格式

到了Kafka 0.10.x,其引入了 Kafka Stream,其依赖了消息的时间,所有这个版本的消息加入了时间戳属性,格式如下:

这个版本相对于 Kafka 0.8.x版本的消息格式变化不大,各个字段的含义:
这个版本的 Message 格式加入了 Key 相关的信息,以及 内容的长度等,各个字段的含义介绍如下:

(1)crc:占用4个字节,主要用于校验消息的内容;

(2)magic:这个占用1个字节,主要用于标识 Kafka 版本。Kafka 0.10.x magic默认值为1

(3)attributes:占用1个字节,这里面存储了消息压缩使用的编码以及Timestamp类型。这个版本的 Kafka 仅支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0011则是snappy压缩,如果是0000则表示没有使用压缩。第4个bit如果为0,代表使用create time;如果为1代表append time;其余位(第5~8位)保留;

(4)key length:占用4个字节。主要标识 Key 的内容的长度 K;

(5)key:占用 K 个字节。存储的是 key 的具体内容

(6)value length:占用4个字节。主要标识 value 的内容的长度 V;

(7)value:这个占用的字节为 V。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

这个版本的压缩消息格式和 Kafka 0.8.x 类似,就不介绍了。

目前的 Kafka 最新版本为 0.11.x,这个版本相对于之前版本有了重大的改变,消息格式完全变了

发布了59 篇原创文章 · 获赞 2 · 访问量 2036

猜你喜欢

转载自blog.csdn.net/zuodaoyong/article/details/103867656