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 之间。