专栏首页shysh95Kafka消息规范

Kafka消息规范

Kafka作为一个消息队列,有其自己定义消息的格式。Kafka中的消息采用ByteBuf,之所以采用ByteBuf这种紧密的二进制存储格式是因为这样可以节省大量的空间。毕竟如果使用Java类的格式来定义消息对象将会浪费大量的空间(Java对象除了本身属性所占的空间外,还存在一些Header,还会存在一些补齐)。

V2消息格式

Kafka的消息格式经历了V0、V1以及V2版本。V0没有时间戳的字段,导致很难对过期的消息进行判断。V0、V1存在很多固定长度的字段,这些字段在实际中往往占用很少,造成浪费,因此V2将其中的很多定义长度的字段设计成可变长度。

可变长度的设计借鉴了Zig-zag编码格式,最高位用来表示当前字节是否已经是某个数编码的最后一个字节(1代表不是,0代表是)。

  • 消息总长度:整个消息的长度,方便消息的遍历以及获取其总长度
  • 属性:保留字段,暂时无作用
  • 时间戳增量:消息距离Batch时间戳的增量,不再使用固定8字节的时间戳,该字段将会大大降低消息的存储空间
  • 位移增量:消息距离Batch位移的增量
  • key length:消息key内容的长度
  • key:消息key的内容
  • value size:消息内容的长度
  • value:消息内容
  • header:header的个数
  • heders:具体的header,对用户可见,可做消息路由或者某些消息元数据的载体。
V2消息批次格式RecordBatch

一个消息批次包含若干个消息组成,其实Kafka的日志文件就是用若干个消息批次组成的,kafka不是直接在消息层面上操作的,它总是在消息批次层面上进行写入。

  • 起始位移:Kafka日志分区中的offset
  • 长度:该消息批次的长度
  • 分区leader版本号
  • 版本号:目前该值是2
  • CRC:CRC校验码,用来确认消息在传输过程中不会被篡改,该字段在V0、V1中是在消息层面的,但对每一条消息都进行CRC,将会造成CPU的浪费
  • 属性:该字段在V0和V1的版本中也是存在于消息层面,在V2中低三位依然表示消息的压缩类型,第4位依然是时间戳类型(一种是客户端指定时间戳,另一种是有kafka broker指定时间戳),第5位和第6位分别表示新引入的事务类型和控制类型
  • 起始时间戳:batch中第一条消息的时间戳
  • 最大时间戳:batch中最后一条消息的时间戳
  • PID、producer epoch、起始序列号:序列号的引入为了生产消息的幂等性,Kafka用它来判断消息是否已经提交,防止重复生产消息。PID代表幂等性producer的ID,producer epoch表示producer携带的当前版本号,broker使用这两个字段判断producer是否有效,防止过期的producer生产消息

本文分享自微信公众号 - shysh95(shysh95),作者:shysh95

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RabbitMQ存储和队列结构

    首先确认一个点,持久化和非持久化的消息都会落地磁盘,区别在于持久化的消息一定会写入磁盘(并且如果可以在内存中也会有一份),而非持久化的消息只有在内存吃紧的时候落...

    shysh95
  • Kafka基于HW备份恢复弊端分析(III)

    上节中我们已经讲述了关于follower副本的同步机制,并且我们提到了基于HW的备份恢复是有缺陷的。在本节中我们会阐述弊端的原因,并且讲解kafka为了解决问题...

    shysh95
  • RabbitMQ进阶使用

    在入门使用曾提到过,生产者发送消息可以使用mandatory参数,该参数的作用主要是在交换器根据路由键无法匹配队列的时候讲消息返回给生产者,但是需要生产者通过R...

    shysh95
  • ActiveMQ介绍

    1、ActiveMQ服务器工作模型       通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消...

    小帅丶
  • 直播评论系统分析设计

    直播评论系统是电商系统一个常用的功能,即在发布新品的时候,为了吸引用户参与和营造互动气氛,让参与的每个人都可以发消息,发完后每个人都可以即时看到新消息,原型和 ...

    心平气和
  • 消息队列| RocketMQ 核心原理

    a. fork下来,起一个demo,上一个测试环境,遇到问题再去社区提问或找些实践文章;

    heidsoft
  • 快速学习-RocketMQ设计理念

    消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ...

    cwl_java
  • 如何把开源项目用好?图解 RocketMQ 核心原理

    本文来自 Apache RocketMQ 的资深用户丁威,他和 MyCat 的核心开发者周继锋合著了《RocketMQ技术内幕:架构设计与实现原理》一书,目的是...

    华章科技
  • 消费端如何保证消息队列MQ的有序消费

    消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端...

    Java_老男孩
  • 消费端如何保证消息队列MQ的有序消费

    消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端...

    用户1148394

扫码关注云+社区

领取腾讯云代金券