kafka各版本消息介绍

news2024/11/25 0:49:05

kafka各版本消息介绍

V0

V0-摘自《深入理解 Kafka:核心设计与实践原理》

  • offset:分区中的偏移量
  • message size:消息大小
  • crc32(4B):crc32校验值。校验范围为magic至value之间。
  • magic(1B):消息格式版本号,此版本的magic值为0。
  • attributes (1B):消息的属性。总共占1个字节,低3 位表示压缩类型:0表示NONE、1表示GZIP、2表示SNAPPY、3 表示LZ4(LZ4自 Kafka 0.9.x引入),其余位保留。
  • keylength(4B):表示消息的 key 的长度。如果为-1,则表示没有设置 key,即key = null.
  • key:可选,如果没有 key 则无此字段
  • value length(4B):实际消息体的长度。如果为-1,则表示消息为空
  • value:消息体。可以为空,比如墓碑 (tombstone)消息。

V1

V1-摘自《深入理解 Kafka:核心设计与实践原理》
改动点:

  • 增加timestamp,标识消息的时间戳
  • v1版本的magic字段的值为1。
  • v1 版本的attributes 字段中的低3位和vO版本的一样,还是表示压缩类型而第4个位(bit)也被利用了起来:0表示timestamp类型为CreateTime,而1表示timestamp类型为LogAppendTime,其他位保留。

timestamp 类型由broker 端参数log,message.timestamp.type 来配置,默认值为CreateTime,即采用生产者创建消息时的时间戳。如果在创建 ProducerRecord 时没有显式指定消息的时间戳,那么 KafkaProducer也会在发送这条消息前自动添加上。下面是 KafkaProducer 中与此对应的一句关键代码:long timestamp= record.timestamp() == null ? time.milliseconds() :record.timestamp();
v1版本的消息的最小长度(RECORDOVERHEADV1)要比版本的大8个字节即22B。

V2

V2-摘自《深入理解 Kafka:核心设计与实践原理》
v2 版本中消息集称为 Record Batch,而不是先前的 Message Set,其内部也包含了一条或多条消息,消息的格式参见图5-7 的中部和右部。在消息压缩的情形下,Record Batch Header部分(参见图5-7左部,从first offset 到records count 字段)是不被压缩的,而被压缩的是records字段中的所有内容。生产者客户端中的ProducerBatch对应这里的RecordBatch,而 ProducerRecord 对应这里的 Record。
先讲述消息格式 Record的关键字段可以看到内部字段大量采用了 Varints,这样 Kafka可
以根据具体的值来确定需要几个字节来保存。v2 版本的消息格式去掉了 crc 字段,另外增加了
length (消息总长度)、timestamp delta (时间戳增量)、offset delta(位移增量)
和headers信息,并且attributes 字段被弃用了,笔者对此做如下分析(key、keylength
value、valuelength字段同v0和vl版本的一样,这里不再赘述)。

  • length:消息总长度
  • attributes:弃用,但还是在消息格式中占据1B 的大小,以备未来的格式扩展。
  • timestamp delta:时间戳增量。通常一个timestamp 需要占用8个字节,如果像
    这里一样保存与RecordBatch 的起始时间戳的差值,则可以进一步节省占用的字节数。
  • offset delta:位移增量。保存与 RecordBatch 起始位移的差值,可以节省占用的字节数。
  • headers:这个字段用来支持应用级别的扩展,而不需要像v0和v1版本一样不得不
    将一些应用级别的属性值嵌入消息体。Header 的格式如上图最右部分所示包含 key
    和value,一个Record 里面可以包含0至多个Header。

对于vI版本的消息,如果用户指定的 timestamp 类型是 LogAppendTime 而不是
CreateTime,那么消息从生产者进入 broker 后,timestamp 字段会被更新,此时消息的crc
值将被重新计算,而此值在生产者中已经被计算过一次。再者,broker 端在进行消息格式转换
时(比如 v1 版转成v0版的消息格式)也会重新计算 cr 的值。在这些类似的情况下,消息从
生产者到消费者之间流动时,crc 的值是变动的,需要计算两次 crc 的值,所以这个字段的设
计在 vO和v1版本中显得比较“鸡肋”。在 v2版本中将cr的字段从 Record 中转移到了
RecordBatch 中。
v2版本对消息集(RecordBatch)做了彻底的修改,参考上图最左部分,除了刚刚提及的
crc字段,还多了如下字段。

  • first offset:表示当前 RecordBatch 的起始位移
  • length:计算从partition leader epoch 字段开始到末尾的长度
  • partition leader epoch:分区leader 纪元,可以看作分区leader 的版本号或更新次数
  • magic:消息格式的版本号,对v2版本而言,magic等于2。
  • attributes:消息属性,注意这里占用了两个字节。低3位表示压缩格式,可以参
    考v0和vl;第4位表示时间戳类型;第5位表示此RecordBatch 是否处于事务中,0
    表示非事务,1表示事务。第6位表示是否是控制消息(ControlBatch),0表示非控
    制消息,而 1表示是控制消息,控制消息用来支持事务功能。
  • last offset delta: RecordBatch 中最后一个 Record 的offset 与first offiset 的差值
    主要被broker用来确保RecordBatch 中Record 组装的正确性。
  • first timestamp:RecordBatch 中第一条 Record 的时间戳。
  • maxtimestamp:RecordBatch 中最大的时间戳,一般情况下是指最后一个 Record
    的时间戳,和last offset delta的作用一样,用来确保消息组装的正确性。
  • producerid:PID,用来支持幂等和事务。
  • producer epoch:和producer id一样,用来支持幂等和事务。
  • first sequence:和 producer id、producer epoch 一样,用来支持幂等和事务
  • recordscount:RecordBatch中Record的个数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA社区版,真香!

IDEA(IntelliJ IDEA)是众多 Java 开发者的首选。 商业版的昂贵 IDEA 商业版(IntelliJ IDEA Ultimate)功能非常强大,能够满足 Java 开发的所有需求,但其高昂的价格…… 此时只能感叹,不是不想用…

学习在windows环境下定时执行python脚本的方法

学习在windows环境下定时执行python脚本的方法 一、准备Python脚本二、创建定时任务1、打开【任务计划程序】2、打开【创建任务】窗口3、创建任务一一常规4、创建任务一一触发器5、创建任务一一操作程序或脚本:添加参数:起始于: 7、创建任务一…

CAD/CAM/CAE SDK 国庆大放送:Eyeshot 2023.X Crack

创建、探索或编辑 3D CAD 数据 开发您自己的(独立的)CAD/CAM/CAE 应用程序,请选择合适自己的版本::关注我,得知全球最新最全的组件动态,这个sdk我们会一直持续更新到最新,跟着我们,你…

GAT学习

文章目录 GAT注意力机制的定义图注意力层多头注意力机制GATConv层中forward函数步骤解析:1. 计算wh。wh:带权特征向量2. 计算注意力分数e3. 激活注意力分数e4. 由边的索引获取邻接矩阵5. 获得注意力分数矩阵。 attention[i][j]表示i j之间的注意力分数torch.where详…

苹果发布iOS 17.1首个beta版本,新增了这几个新功能!

苹果今日向iPhone/iPad用户推送了iOS/iPadOS17.1开发者预览版Beta版更新,iOS/iPadOS17.1Beta内部版本号为21B5045h。 iOS/iPadOS17.1Beta更新内容如下: 一:Apple Music“已喜爱”分类 用户可以在 iOS 17.1 的 Apple Music 中收藏歌曲、专辑…

优化邮箱体验!推荐替代方案:提升企业效率的选择

近年来,随着互联网技术的快速发展,电子邮件成为了企业沟通和协作的重要工具。而作为国内知名的企业邮箱服务提供商,网易企业邮箱凭借其稳定性、安全性和易用性,受到了广大企业的青睐。然而,随着市场竞争的加剧&#xf…

26532-2011 地理标志产品 慈溪杨梅

声明 本文是学习GB-T 26532-2011 地理标志产品 慈溪杨梅. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了慈溪杨梅的术语和定义、地理标志产品保护范围、要求、试验方法、检验规则及标志、 标签、包装、运输和贮存。 本标准适用…

基于java的银行风险预警系统的研究与实现

文章目录 导文摘要:前言:绪论:相关技术与方法介绍:系统分析:系统设计:系统实现:系统测试:总结与展望:导文 基于java的银行风险预警系统的研究与实现 本文基于Java开发了一款银行风险预警系统,旨在帮助银行有效管理风险并提前预警潜在风险。下面将对文中的各个部分进行…

微信小程序 课程签到系统

目录 前端页面展示主页面我的课程个人中心评论功能签到功能课程绑定超级管理员页面 前端文件结构文件结构app.json前端架构和开发工具前端项目地址 后端后端架构后端项目地址 注意事项 前端页面展示 主页面 登录页面: 账号是:用户名或者手机号 密码是&a…

【Elasticsearch】聚合查询(四)

Elasticsearch(简称为ES)是一个基于Lucene的开源搜索和分析引擎,提供了丰富的聚合查询功能。聚合查询指的是在搜索结果上执行分组、汇总和统计等操作,以便从大量数据中提取有用的信息和洞察。 这篇文章主要介绍检索相关的操作&…

freertos的任务调度器的启动函数分析(根据源码使用)

volatile uint8_t * const pucFirstUserPriorityRegister ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 portFIRST_USER_INTERRUPT_NUMBER ); 通过宏pucFirstUserPriorityRegister0xE000E400(根据宏名字,这是NVIC寄存器地址) 查手册…

26523-2022 精制硫酸钴 随笔练习

声明 本文是学习GB-T 26523-2022 精制硫酸钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制硫酸钴的要求、试验方法、检验规则、标志、标签、包装、运输和贮存。 本文件适用于精制硫酸钴。 注:该产品主要用于…

【面试题】有了Docker为啥还需要k8s?

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

【python】基础语法

文章目录 元组列表字典集合推导式函数错误和异常处理文件和操作系统 元组 元组是一个固定长度,不可改变的Python序列对象。创建元组的最简单方式,是用逗号分隔一列值。 创建 2. 元组不可修改的解释 对于元组对象不可变的说明,通俗一点就是…

自学成为一名黑客

前言:想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安…

【操作系统】调度算法的评价指标和三种调度算法

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 操作系统 一、调度算法的评价指标1.1 CPU利…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

深入剖析ThreadLocal使用场景、实现原理、设计思想

前言 ThreadLocal可以用来存储线程的本地数据,做到线程数据的隔离 ThreadLocal的使用不当可能会导致内存泄漏,排查内存泄漏的问题,不仅需要熟悉JVM、利用好各种分析工具还耗费人工 如果能明白其原理并正确使用,就不会导致各种意…

【Verilog 教程】6.2Verilog任务

关键词:任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程&a…

win10搭建Selenium环境+java+IDEA(2)

接着上一个搭建环境开始叙述:win10系统x64安装java环境以及搭建自动化测试环境_荟K的博客-CSDN博客 上一步结尾的浏览器驱动,本人后面改到了谷歌浏览器.exe文件夹下: 这里需要注意,这个新路径要加载到系统环境变量中。 上一步下…