kafka-消息格式

消息

消息包含一个可变长度的 header ,一个可变长度不透明的字节数组 key ,一个可变长度不透明的字节数组 value ,消息中 header 的格式会在下一节描述. 保持消息中的 key 和 value 不透明(二进制格式)是正确的决定: 目前构建序列化库取得很大的进展,而且任何单一的序列化方式都不能满足所有的用途.毋庸置疑,使用kafka的特定应用程序可能会要求特定的序列化类型作为自己使用的一部分. RecordBatch 接口就是一种简单的消息迭代器,它可以使用特定的方法批量读写消息到 NIO 的 Channel 中.

消息通常按照批量的方式写入.record batch 是批量消息的技术术语,它包含一条或多条 records.不良情况下, record batch 只包含一条 record. Record batches 和 records 都有他们自己的 headers.在 kafka 0.11.0及后续版本中(消息格式的版本为 v2 或者 magic=2)解释了每种消息格式。

V2版本对消息集合称为RecordBatch
在这里插入图片描述
整体来看分为两个大部分:recordBatch header,records。其中recordBatch header包含13个字段,这里为何加个修饰recordBatch,文后有解释;records是一个嵌套结构体。

消息格式Record的关键字段,可以看到内部字段大量采用了Varints,这样Kafka可以根据具体的值来确定需要几个字节来保存。v2版本的消息格式去掉了crc字段,另外增加了length(消息总长度)、timestamp delta(时间戳增量)、offset delta(位移增量)和headers信息,并且attributes被弃用了,至于key、key length、value、value length字段和v0以及v1版本的一样。

Record的消息格式

名称含义字节数
ength消息总长度(每条)可变长字段
attributes弃用(保留未来的格式扩展使用)1B
timestamp delta时间戳增量。通常一个时间戳会占据8个字节,这里保存的是由RecordBatch的起始时间戳的差值,明显占据更少的空间可变长字段
offset delta位移增量。保存与RecordBacth的起始位移的差值,同样可以节省占用字节数。可变长字段
headers为了做应用级别的扩展使用,Header的格式如上图最有,包含key和value,一个Record里面可以包含0至多个Header 作者:觅密学堂IT分享 https://www.bilibili.com/read/cv15447937 出处:bilibili

RecordBatch格式

名称含义字节数
first offsetRecordBacth的起始位移,也就是第一条消息的位移8B
length计算从magic字段开始到末尾的总长度4B
partition leader epochleader的版本号,为了副本同步使用4B
magic消息的版本号1B
Attributes第三位压缩格式,第四位时间戳类型,第五位表示是否处于事务当中,0,非事务,1事务 第六位表示是否控制消息2B
last offset deltaRecord Batch 中最后一个 消息的位移与第一个位移的差值,主要用来Broker来保证RecordBacth中Record组装的准确性。4B
first timestampRecordBatch中第一条消息的时间戳8B
max timestamp最大时间戳,一般是最后一条消息的时间戳8B
record count消息的个数 4B
header部分

attributes:消息属性,注意这里占用了两个字节,具体格式如图所示(此图只画一个字节各位意义,实际占用两个字节)
低3位表示压缩类型,可以参考v0和v1;
第4位表示时间戳类型;
第5位表示此RecordBatch是否处于事务中,0表示非事务,1表示事务。
在这里插入图片描述

第6位表示是否是Control消息,0表示非Control消息,而1表示是Control消息,Control消息用来支持事务功能。

名称含义
first offset表示当前RecordBatch的起始位移。
length计算partition leader epoch到末尾的长度
partition leader epoch分区leader纪元,可以看作分区leader的版本号或更新次数
magic消息格式的版本号,对于v2版本而言,magic等于2。
last offset deltaRecordBatch中最后一个Record的offset与first offset的差值。主要被broker用来确认RecordBatch中Records的组装正确性。
first timestampRecordBatch中第一条Record的时间戳。
max timestampRecordBatch中最大的时间戳,一般情况下是指最后一个Record的时间戳,和last offset delta的作用一样,用来确保消息组装的正确性。
producer id用来支持幂等性。
producer epoch和producer id一样,用来支持幂等性和事务。
first sequence和producer id、producer epoch一样,用来支持幂等性和事务。
records countRecordBatch中Record的个数。

V2版本的消息不仅提供了更多的功能,比如事务、幂等性等,某些情况下还减少消息的空间占用,提高磁盘利用率,总体性能提升很大。具体读者可以自行测试,作者也用一个章节专门介绍编码实测方案、执行过程和测试结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值