kafka之消息格式 - 爱码网文章目录Kafka版本消息格式V0版本V1版本Message SetV0与V1的缺陷V2版本Kafka版本kafka版本1.1.1,可能绝大部分也适用于kafka 0.10.x及以上版本。消息格式目前Kafka消息格式有三个版本,V0、V1和V2。V0版本V0版本主要是指Kafka0.10.0.0之前的版本,是kafka最早的消息版本https://www.likecs.com/show-204457519.html

Kafka版本

  1. kafka版本1.1.1,可能绝大部分也适用于kafka 0.10.x及以上版本。

消息格式

  1. 目前Kafka消息格式有三个版本,V0、V1和V2。

V0版本

  1. V0版本主要是指Kafka0.10.0.0之前的版本,是kafka最早的消息版本

  2. 字段含义

    • CRC(4B):CRC校验码,占用4个字节,校验magic至value之间字节是否被篡改
    • magic(1B):消息格式版本号,占用1个字节。V0版本是0,V1版本是1,V2版本是2
    • attributes(1B):属性字段,占用1个字节,只使用低3位表示消息的压缩类型,其他5位是保留位。
      • 0表示NONE,表示不启用压缩
      • 1表示GZIP
      • 2表示SNAPPY
      • 3表示LZ4
    • key length(4B):表示消息的key的长度。如果为-1,则表示没有设置key,即key=null
    • key:消息key,长度由key length值指定。如果key length值是-1,则无key(没有此字段)
    • value length(4B):表示消息的长度,占用4字节。
    • value:消息value,长度由value length值指定。如果value length值是-1,则无value,消息没有该字段。
  3. 消息头部(message Header):除了Key和Value之外的所有字段统称为消息头部。总共占用14字节(4B+1B+1B+4B+4B),即V0版本的消息长度最小是14B

  4. 此版本的问题

    • 即使不指定key(即key length=-1),还是要占用4个字节的空间
    • 即使不指定value(即value length=-1),还是要占用4个字节的空间
    • 没有消息的时间信息。kafka定期删除过期log只能依靠文件的最后修改时间。文件系统最后的修改时间很容易受到外部不确定因素的干扰。

V1版本

  1. V1版本主要是[0.10.0.0,0.11.0.0)之间的版本

  2. V1与V0的主要差异

    • 引入了8B的时间戳,即V1版本的消息头部最小是22B(14B+8B)
    • 属性字段第4位被用于指定时间戳类型
      • 0表示timestamp类型为CREATE_TIMECREATE_TIME表示在消息创建时由producer指定的时间戳
      • 1表示timestamp类型为LOG_APPEND_TIMELOG_APPEND_TIME 表示消息被发送到broker端时由broker指定的时间戳。

Message Set

  1. Kafka的消息层次分为:消息集合(message set)和消息。V0和V1版本使用的是日志项(log entry),以下是日志项的格式

  2. 每个消息集合中的日志项由shallow message和log entry header组成

    • shallow message:如果没有启用消息压缩,那么shallow message就是这条消息本身。如果启用消息压缩,kafka会将多条消息压缩到一起统一封装成shallow message的value字段。此时该shallow message被称为wrapper消息(或者外部消息),而value字段中包含的消息则被称为inner消息(内部消息)。v0和v1版本中的日志项只能包含一条shallow message
    • log entry header(日志项头部):由8B的offset和4B的size组成。offset指该消息在分区日志中的offset,如果是未压缩的消息,该offset就是消息的offset,否则该字段表示wrapper消息中最后一条inner消息的offset。因此,从V0、V1版本消息集合日志项中搜索该日志项的起始偏移是非常困难的,需要遍历所有的inner消息,即broker需要解压缩操作。

V0与V1的缺陷

  1. 空间利用率不高:不论key和value长度是多少,总是固定占用4B
  2. 只保存最新消息偏移量:如果启用压缩,offset是消息集合中最后一条消息的offset。如果想要获取第1条消息的offset,必须解压所有消息并加载到内存中,然后反向遍历才能获取到
  3. CRC校验,为每条消息都执行CRC没有必要
  4. 未保存消息长度:每次需要单条消息的总字节数信息时都需要计算得出,没有使用单独字段来保存。每次计算时为了避免对现有数据结构的破坏,都需要大量的对象副本, 解序列化效率很低。

V2版本

  1. V1版本主要是0.11.0.0(包含)之后的版本。此版本相比于v0和v1改动很大,引入了变长整型(Varints)和ZigZag编码(借鉴ProtoBuffer中的Zig-zag编码方式,绝对值较小的整数占用比较少的字节)。Varints是使用一个或多个字节来序列化整数的一种方法,数值越小,其所占用的字节数就越少。Zig-zag编码方式,使得绝对值较小的整数占用比较少的字节

  2. 字段详解

    • 增加消息总长度字段
    • 可变时间戳,使用一个可变长度保存与batch起始时间戳的差值。差值一般很小,所以需要保存的字节也小
    • 增加offset,保存消息offset与外层batch起始offset的差值,节省消息总字节数
    • 增加消息headers,主要是为了满足用户定制化需求,用户手动设置的
    • 去除CRC校验,V2不再为每条消息计算CRC32值,而是对整个消息batch进行CRC校验
    • 废弃attribute字段。V2版本将原先保存在attribute字段中的压缩类型、时间戳等信息统一保存在外层batch格式字段中,但是依然保留了单字节attribute为了以后扩展使用。
  3. V2版本中消息集合(message set)被消息批次所取代,叫做RecordBatch。这里的RecordBatch与producer中的batch不是一个含义。

  4. bath字段详解

    • CRC被放入Batch

    • 增加2B的attribute。

      • 最低3位依然是压缩类型

      • 第4位保存时间戳类型(NO_TIMESTAMP_TYPE是-1,CREATE_TIME是0,LOG_APPEND_TIME是1)。

      • 第5位事务类型(事务消息是1,非事务消息是0)

      • 第6位控制类型(ABORT是0,COMMIT是1,UNKNOWN是-1)

    • PID、 producer epoch 和***等信息都是 0.11.0.0 版本为了实现幂等性 producer 和支持事务而引入的。Kafka依靠PID+epoch来辨别消息是否己成功提交,从而防止出现重复生产消息。

  5. 0.11.0.0版本(及以后)的 Kafka消息在支持事务、幕等性 producer的同时还在一定程度上减少了网络I/O和磁盘 I/O 的开销(因V2版本协议的缘故)

kafka之消息格式相关推荐

  1. Kafka的消息格式

    Commit Log Kafka储存消息的文件被它叫做log,按照Kafka文档的说法是: Each partition is an ordered, immutable sequence of me ...

  2. Kafka:消息格式的选择 Avro JSON XML String JavaBean

    使用Kafka是应该用怎样的消息格式才是最优? 决定我们使用何种消息格式考虑的因素有两种,一个是方便,一个效率. 就方便来说其实就是数据的转换(或者Mapping),效率包括时间和空间两个维度,当然能 ...

  3. 整理CDC捕获消息后发送到kafka各类消息格式

    一.mysql-ogg 资料 delete {"table":"TABLE","op_type":"D","o ...

  4. 一文看懂Kafka消息格式的演变

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. kafka(七):消息格式

    1.kafka消息格式: (1)一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成  (2)header部分由一个字节的magic(文件格式)和四个字节的CRC3 ...

  6. Apache Kafka消息格式的演变(0.7.x~0.10.x)

    用 Kafka 这么久,从来都没去了解 Kafka 消息的格式.今天特意去网上搜索了以下,发现这方面的资料真少,很多资料都是官方文档的翻译:而且 Kafka 消息支持压缩,对于压缩消息的格式的介绍更少 ...

  7. Kafka消息格式中的变长字段(Varints)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  8. Kafka消息格式的选择

    使用Kafka是应该用怎样的消息格式才是最优? 决定我们使用何种消息格式考虑的因素有两种,一个是方便,一个效率.就方便来说其实就是数据的转换(或者Mapping),效率包括时间和空间两个维度,当然能压 ...

  9. kafka 消息格式设计实现

    目前kafka消息格式有三个版本(假定v0,v1,v2),0.10.0之前使用的是v0版本,之后慢慢演变出v1,v2,后两个版本在设计方式上没有什么特别大的区别,只是做了些空间上的优化,同样的消息,新 ...

最新文章

  1. 齐次坐标的理解(1)
  2. PHP用户输入安全过滤和注入攻击检测
  3. 快速理解平衡二叉树、B-tree、B+tree、B*tree
  4. 【Android 安装包优化】WebP 图片转换 ( 使用 iSparta 转换 WebP 图片格式 | Google 提供的 libwebp 库 )
  5. 业务服务管理究竟为何可望而不可及
  6. 反思laravel-admin的使用总结
  7. 职场必须要会的餐桌礼仪
  8. Oracle_PL/SQL developer拷贝粘贴中文乱码问题
  9. 我是这么给娃娃取名的(使用 node.js )
  10. 【SpringCloud】Spring cloud Alibaba seata 分布式事务
  11. Log4j介绍,log4j.properties配置详解
  12. pythonjam安装库_python及pycharm的安装
  13. simpledateformat格式_为什么日期格式化时必须有使用y表示年,而不能用Y?
  14. idea创建类时自动添加注释
  15. win10添加惠普hp laserjet 1010HB打印机
  16. 浙大PAT 1013题 1013. Battle Over Cities
  17. Win10 分页缓冲池 过大
  18. git将一个分支的提交合并到另一个分支
  19. OBS,vMIX,Wirecast,TCliveSP直播串流导播软件区别及比较
  20. 善用 Google 的 手气不错 I'm feeling lucky 搜索

热门文章

  1. 海外网红营销:最受欢迎的8种合作模式
  2. C语言读取txt文件内容
  3. 远程工作_成为远程工作者很烂-远程工作者万岁
  4. CF723D. Lakes in Berland[DFS floodfill]
  5. 动态路由协议OSPF介绍
  6. TinoyOs和nesC语言
  7. 机器学习数学基础之高数篇——简单的泰勒公式(python版)
  8. 移动通讯技术区别于计算机,移动通信技术与计算机通信技术融合发展探析
  9. mysql复制数据库cmd指令
  10. 有关pycharm安装numpy简便方法