用 Kafka 这么久,从来都没去了解 Kafka 消息的格式。今天特意去网上搜索了以下,发现这方面的资料真少,很多资料都是官方文档的翻译;而且 Kafka 消息支持压缩,对于压缩消息的格式的介绍更少。基于此,本文将以图文模式介绍 Kafka 0.7.x、0.8.x 以及 0.10.x 等版本 Message 格式,因为 Kafka 0.9.x 版本的消息格式和 0.8.x 一样,我就不单独介绍了。

设计良好的消息格式应该很容易支持版本的升级,并且新版本消息格式兼容老版本消息格式。现在我们就来看看 Kafka 消息格式是如何设计的。

Kafka 0.7.x 消息格式

这个版本消息的格式相对简单,具体如下:

从上面可以看出,Kafka 0.7.x 版本的消息格式比较简单,主要包括:
•magic:这个占用1个字节,主要用于标识 Kafka 版本。这个版本的 Kafka magic有 0 和 1 两个值,不过默认 Message 使用的是 1;
•attributes:占用1个字节,这里面存储了消息压缩使用的编码。这个版本的 Kafka 仅支持 gzip 和 snappy 两种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0000则表示没有使用压缩。
•crc:占用4个字节,主要用于校验消息的内容,也就是上图的Value。
•value:这个占用的字节为 N - 6,N为Message总字节数,6就是前面几个属性占用的字节和。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

大家在上图还看到 MessageSet 的格式,一个 MessageSet 包含多条消息,其中:
•offset:占用8个字节,这个是 Kafka 消息存储到磁盘之后的物理偏移量;
•size:占用4个字节,这是消息的大小。
•message:占用N个字节,这个就是上图的Message,格式见Message Format。

需要注意的是, Kafka 从 Producer 发送到 Broker 是以 MessageSet 为单位发送的,而不是以 Message 发送的。而且压缩的时候也是以 MessageSet 进行压缩的,并不是只压缩一条消息,这样做的目的是提高效率。压缩之后的消息格式如下:

从上图可以看出,压缩之后的内容作为另外一条消息的内容进行存储,其中包含了多条消息。

Kafka 0.8.x (0.9.x) 消息格式

到了Kafka 0.8.0,消息格式变化了,相对于Kafka 0.7.x加入了几个字段,主要如下:

这个版本的 Message 格式加入了 Key 相关的信息,以及 内容的长度等,各个字段的含义介绍如下:
•crc:占用4个字节,主要用于校验消息的内容;
•magic:这个占用1个字节,主要用于标识 Kafka 版本。
•attributes:占用1个字节,这里面存储了消息压缩使用的编码。这个版本的 Kafka 仅支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0011则是snappy压缩,如果是0000则表示没有使用压缩。
•key length:占用4个字节。主要标识 Key 的内容的长度 K;
•key:占用 K 个字节。存储的是 key 的具体内容
•value length:占用4个字节。主要标识 value 的内容的长度 V;
•value:这个占用的字节为 V。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

这个版本的MessageSet 格式和之前一样,就不介绍了。但是需要注意的是,这个版本 MessageSet 中的 offset 字段存储的已经不是消息物理偏移量了,而是逻辑地址,比如0,、1、2…

我们在上面说了 Kafka 压缩的时候是将整个 MessageSet 进行压缩的,压缩完之后的内容作为另外一个 Message 的 value,如下:

从上图看到,压缩消息的格式和非压缩格式的消息不一样,少了 Key 的存储空间,而且这时候消息的 value 为压缩之后的消息内容。

Kafka 0.10.x 消息格式

到了Kafka 0.10.x,其引入了 Kafka Stream,其依赖了消息的时间,所有这个版本的消息加入了时间戳属性,格式如下:

可以看出,这个版本相对于 Kafka 0.8.x版本的消息格式变化不大,各个字段的含义:
这个版本的 Message 格式加入了 Key 相关的信息,以及 内容的长度等,各个字段的含义介绍如下:
•crc:占用4个字节,主要用于校验消息的内容;
•magic:这个占用1个字节,主要用于标识 Kafka 版本。Kafka 0.10.x magic默认值为1
•attributes:占用1个字节,这里面存储了消息压缩使用的编码以及Timestamp类型。这个版本的 Kafka 仅支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是0001则标识gzip压缩,如果是0010则是snappy压缩,如果是0011则是snappy压缩,如果是0000则表示没有使用压缩。第4个bit如果为0,代表使用create time;如果为1代表append time;其余位(第5~8位)保留;
•key length:占用4个字节。主要标识 Key 的内容的长度 K;
•key:占用 K 个字节。存储的是 key 的具体内容
•value length:占用4个字节。主要标识 value 的内容的长度 V;
•value:这个占用的字节为 V。value即是消息的真实内容,在 Kafka 中这个也叫做payload。

这个版本的压缩消息格式和 Kafka 0.8.x 类似,就不介绍了。

目前的 Kafka 最新版本为 0.11.x,这个版本相对于之前版本有了重大的改变,消息格式完全变了。由于其还在开发中,本文就不再介绍了,如果大家感兴趣,可以到官方文档进行阅读。

Apache Kafka消息格式的演变(0.7.x~0.10.x)相关推荐

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

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

  2. kafka 消息格式设计实现

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

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

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

  4. Kafka消息偏移量的演变

    一.Kafka 0.7.x 1.非压缩消息 MessageSet 格式的时候就说Offset字段存储的是消息存储到磁盘之后的物理偏移量 从上图可以看出,每条消息存在磁盘的偏移量是其距离文件开头的绝对偏 ...

  5. Kafka消息格式的选择

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

  6. kafka 发布-订阅模式_使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...

    kafka 发布-订阅模式 发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序. 在解耦的系统之间共享数据的能力并不是一个容易解决的问题. 考虑一个企 ...

  7. 使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...

    发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序. 在解耦的系统之间共享数据的能力并不是一个容易解决的问题. 考虑一个企业,其中具有使用不同语言和平 ...

  8. kafka之消息格式

    kafka之消息格式 - 爱码网文章目录Kafka版本消息格式V0版本V1版本Message SetV0与V1的缺陷V2版本Kafka版本kafka版本1.1.1,可能绝大部分也适用于kafka 0. ...

  9. kafka(七):消息格式

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

最新文章

  1. 【技术趋势】德勤发布2020技术趋势报告,五个新趋势可引发颠覆性变革
  2. 网络营销之微微博营销
  3. C语言多维数组本质技术推演
  4. Java中final和static对修饰类、方法、属性的总结
  5. C++初始编程及相关的问题总结
  6. ISA Server 2006 升级到 TMG2010
  7. oopc——8.经典案例1-rt thread
  8. Log4net之开始使用
  9. 做一个简单的python爬虫_python制作一个简单网络爬虫
  10. windows下使用mahout|Taste实现协同过滤算法
  11. 使用 Python 多处理库处理 3D 数据
  12. Jmetter并发测试工具使用笔记
  13. 百度地图和Echarts的简单使用
  14. JSP项目进度管理系统myeclipse开发mysql数据库web结构java编程
  15. win10共享打印机搜索不到计算机,Win10 1909电脑中搜索不到共享打印机的解决方法...
  16. 蒜头君的藏书(STL—map)
  17. ESP32开发路程WIFI篇——极简连接WIFI,模拟设备连接阿里云,ESP32连接阿里云
  18. 用Cadence Virtuoso绘制反相器教程
  19. 错误类型:reflection.ReflectionException: Could not set property ‘xxx‘ of ‘class ‘xxx‘ with value ‘xxx‘
  20. 此去经年如梦,更与何人说?

热门文章

  1. for of 的用法区别_ES6语法:var、let、const的区别详解
  2. python流获取控制台_对Python捕获控制台输出流的方法详解
  3. 电气备自投笔记书籍介绍(持续更新中)
  4. VTK:提取选择 OriginalId用法实战
  5. boost::iterator_range相关的测试程序
  6. BOOST_PREDEF_TESTED_AT宏相关的测试程序
  7. hana::detail::variadic::take用法的测试程序
  8. boost::geometry::enrich_intersection_points用法的测试程序
  9. DCMTK:CT位置FG类测试
  10. VTK:可视化之Blow