Kafka入门之broker-消息设计
消息设计
1.消息格式
Kafka的实现方式本质上是使用java NIO的ByteBuffer来保存消息,同时依赖文件系统提供的页缓存机制,而非依靠java的堆缓存。
2.版本变迁
0.11.0.0版本是kafka的一个里程碑式的大版本。特别是对于消息格式进行了改进和升级。kafka的消息版本变迁:
1.V0:指0.10.0.0之前的版本,是kafka最早的消息版本,格式如下:
crc校验码:4字节,用于确保消息在传输过程中不会被恶意篡改。
magic:单字节的版本号,V0版本magic=0,V1版本magic=1,V2版本magic=2.
attribute:单字节属性字段,目前只使用低3位表示消息的压缩类型
key长度字段:4字节,若未指定key,则给该字段赋值为-1.
key值:
value长度字段:4字节,未指定value,则为-1。
value值:
2.V1:Kafka0.10.0.0中改进了V0版本的消息格式,推出了V1版本的格式,主要变化就是在消息中加入了时间戳字段。
新增消息时间戳,并且attribute的第四位表示时间戳类型。
3.V2:
消息集合:一个消息集合包含若干日志项,而每个日志项都装了实际的消息和一组元数据信息。Kafka日志文件就是由一系列消息集合日志项构成的。Kafka不会在消息层面上直接操作,它总是在消息集合上进行写入操作。
V2版本之前的消息集合:
浅层消息+日志头部,头部由8字节位移(offset)字段加上4字节的长度(size)字段构成,这里的offset指的是该消息在Kafka分区日志中offset。如果未压缩该offset就是消息的offset,否则该字段表示wrapper消息中最后一条inner消息的offset。因此从v0,v1版本消息集合日志项中搜寻该日志项的起始位移是一件非常困难的事情,因为在该过程中Kafka需要深度便利所有inner消息,这也就意味着broker端需要执行解压缩的操作,可见代价之高。
V2版本消息格式:v2版本借鉴了Google ProtoBuffer中的zig-zag编码方式,使得绝对值较小的整数占用比较少的字节
增加消息总长度字段:kafka操作消息时可直接获取总字节数,直接创建出等大小的ByteBuffer,然后分别填装其他字段,简化了消息处理过程,总字节数的引入还实现了消息遍历时的快速跳跃和过滤,省去了很多空间拷贝的开销。
保存时间戳增量:不再使用8字节保存时间戳信息,而是用可变长度保存与batch起始时间戳的差值
保存位移增量:保存消息位移与外层batch起始位置的差值,而不再固定保存8字节的位移值。
增加消息头部:对用户可见,v2版本中每条消息都必须有一个头部数组,每个头部信息都是一个key-value主要为了满足用户的一些定制化需求,比如,做集群间的消息路由或承载消息的一些特定元数据信息。
去除消息级CRC校验:对整个消息batch进行crc校验。
废弃attribute字段:v0,v1版本格式都有一个attribute字段,v2版本的消息正式废弃了这个字段,原先保存在attribute字段中的压缩类型,时间戳等信息都统一保存在外层的batch格式字段中,但v2版本依然保留了单字节的attribute字段留作以后扩展使用。
batch格式:
Kafka入门之broker-消息设计的更多相关文章
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状 ...
- [转帖]kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ...
- kafka学习笔记(一)消息队列和kafka入门
概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...
- 【原创】Kafka 0.11消息设计
Kafka 0.11版本增加了很多新功能,包括支持事务.精确一次处理语义和幂等producer等,而实现这些新功能的前提就是要提供支持这些功能的新版本消息格式,同时也要维护与老版本的兼容性.本文将详细 ...
- Kafka设计解析(十六)Kafka 0.11消息设计
转载自 huxihx,原文链接 [原创]Kafka 0.11消息设计 目录 一.Kafka消息层次设计 1. v1格式 2. v2格式 二.v1消息格式 三.v2消息格式 四.测试对比 Kafka 0 ...
- 消息队列中间件(三)Kafka 入门指南
Kafka 来源 Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级 ...
- kafka入门教程链接
http://www.aboutyun.com/forum.php?mod=viewthread&tid=12882 经典入门教程 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创 ...
- 【Kafka入门】Kafka基础结构和知识
基本概念的总结 在基本的Kafka架构中,producer将消息发布到Kafka话题中,一个Kafka话题通常指消息的类别或者名称,Kafka话题被集群中一个充当Kafka server角色的 bro ...
- Kafka 入门三问
目录 1 Kafka 是什么? 1.1 背景 1.2 定位 1.3 产生的原因 1.4 Kafka 有哪些特征 消息和批次 模式 主题和分区 生产者和消费者 broker 和 集群 1.5 Kafka ...
随机推荐
- Codeforces Round #679 (Div. 2, based on Technocup 2021 Elimination Round 1)
考场上只做出来四道,第二天一早就写出来了E,蛮绝望的. A Finding Sasuke 水构造 #include <cstdio> #include <algorithm> ...
- 给 Mac 添加右键菜单「使用 VSCode 打开」
最终的实现效果是在文件 / 文件夹上右击时,会出现菜单项「用 VSCode 打开」,点击后会启动 Visual Studio Code 打开对应的文件 / 文件夹. 实现步骤 打开「自动操作.app」 ...
- pytorch 图像分类数据集(Fashion-MNIST)
import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot ...
- Django前后端安全验证
会话技术 关注公众号"轻松学编程"了解更多. 1.Cookie 客户端会话技术(数据存储在客户端) 以key-value的形式进行存储 cookie的操作都是通过Response来 ...
- P5691 [NOI2001]方程的解数
题意描述 方程的解数 求方程 \(\sum_{i=1}^{n}k_ix_i^{p_i}=0(x_i\in [1,m])\) 的解的个数. 算法分析 远古 NOI 的题目就是水 类似于这道题. 做过这道 ...
- HashMap的初始化,到底都做了什么?
HashMap的初始化,到底都做了什么? HashMap初始化参数都是什么?默认是多少? 为什么建议初始化设置容量? tableSizeFor方法是做什么的? 如何获取到一个key的hash值?及计算 ...
- CI框架导入 excel
整合PHP Excel和PHPexcelReader到 librarys下面 两个excel整合成一个excel <?php class Excel extends Control ...
- SpringBoot的外部化配置最全解析!
目录 SpringBoot中的配置解析[Externalized Configuration] 本篇要点 一.SpringBoot官方文档对于外部化配置的介绍及作用顺序 二.各种外部化配置举例 1.随 ...
- tensorflow的广播机制
TensorFlow支持广播机制(Broadcast) TensorFlow支持广播机制(Broadcast),可以广播元素间操作(elementwise operations).正常情况下,当你想要 ...
- 【开发板试用报告】学习GPIO编程
温湿度传感器 参考许老师教程:https://gitee.com/hihopeorg/ 下载源码git clone https://github.com/xusiwei/harmonyos-aht20 ...