Kafka 一个 Message 由固定长度的 header和一个变长的消息体 body组成。将 Message 存储在日志时采用不同于 Producer 发送的消息格式。每个日志文件都是一个 log entries(日志项)序列:
V2 开始的新格式
- Record Batch:
- 从 v2 版本开始,Kafka 引入了 Record Batch(记录批次)的概念,代替了之前的 Message Set(消息集)。
- Record Batch 包含了一组消息,每个 Batch 都有自己的头信息,其中包含了 Batch 的基础属性,如 BaseOffset、LastOffset、Partition Leader Epoch 等。
- 每个 Batch 内部的消息格式类似于 v1 版本,但是增加了更多的元数据来支持更高效的压缩和解压操作。
- Record Batch 头信息:
BaseOffset: Batch 中第一条消息的偏移量。LastOffsetDelta: Batch 中最后一条消息的偏移量与第一条消息偏移量之间的差值。Partition Leader Epoch: Partition 的领导者时期,用于检测过时的副本。MaxTimestamp: Batch 中消息的最大时间戳。ProducerID和ProducerEpoch: 生产者的 ID 和时期,用于检测重复消息。Crc: Batch 的 CRC32 校验和。Attributes: 属性字段,包含了压缩类型等信息。CompressionType: 压缩类型,如无压缩(None)、GZIP、Snappy、LZ4 等。Records: Batch 中的实际消息记录。
- Record 格式:
OffsetDelta: 当前消息的偏移量与 Batch 中前一条消息偏移量的差值。Key: 消息的键(可选)。Value: 消息的值。TimestampDelta: 当前消息的时间戳与 Batch 中前一条消息时间戳的差值(仅在时间戳类型为 CreateTime 时有效)。
Kafka 没有限定单个消息的大小,但一般推荐消息大小不要超过 1MB,通常一般消息大小都在 1 ~ 10KB 之间。