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 ...
随机推荐
- python解决百钱买百鸡
百钱买百鸡 关注公众号"轻松学编程"了解更多. 现有100钱,公鸡5文钱一只,母鸡3文钱一只,小鸡一文钱3只 要求:公鸡.母鸡,小鸡都要有,把100文钱花完,买的鸡的数量正好是10 ...
- 微信小程序开发之云开发
创建云开发小程序项目 开通云开发 开通后界面 选择开发环境 开启使用npm模块 安装wx-server-sdk npm install --save wx-server-sdk@latest 创建云函 ...
- streamreader
using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\Administrator\桌面\1.txt&qu ...
- Pandas_VBA_数据分类比较
Python与VBA的比较2 需求: input文件中有两列数据,第一列为Name,第二列为Score,Name列里有重复的值,要求按照name的唯一值统计 score,输出到output文件按中. ...
- sendfile zero-copy
传统read/write进行网络文件传输过程当中,文件数据实际上经过四次copy操作: 硬盘->内核buf->用户buf->socket相关缓冲区->协议引擎 而sendfil ...
- 自定义泛型方法, 三级排序, low版,待升级
package com.jd.dashboard.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken ...
- mdp文件-Chapter4-MD.mdp
终于到了mdp系列的第四篇,最终MD模拟的mdp文件 先上代码,md.mdp 1 title = OPLS Lysozyme MD simulation 2 ; Run parameters 3 in ...
- wait函数与waitpid函数(僵尸进程)
当子进程退出时,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程.它只保留最小的一些 ...
- 用GitHub Pages搭建博客(五)
本篇介绍GitHub Pages自定义域名 在用GitHub Pages搭建博客(二)中介绍到,默认的GitHub Pages域名就是仓库地址,即: 账号名.github.io 如果我们要使用自定义域 ...
- 从ceph对象中提取RBD中的指定文件
前言 之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应 ...