消息设计

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-消息设计的更多相关文章

  1. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

    问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状 ...

  2. [转帖]kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ...

  3. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  4. 【原创】Kafka 0.11消息设计

    Kafka 0.11版本增加了很多新功能,包括支持事务.精确一次处理语义和幂等producer等,而实现这些新功能的前提就是要提供支持这些功能的新版本消息格式,同时也要维护与老版本的兼容性.本文将详细 ...

  5. Kafka设计解析(十六)Kafka 0.11消息设计

    转载自 huxihx,原文链接 [原创]Kafka 0.11消息设计 目录 一.Kafka消息层次设计 1. v1格式 2. v2格式 二.v1消息格式 三.v2消息格式 四.测试对比 Kafka 0 ...

  6. 消息队列中间件(三)Kafka 入门指南

    Kafka 来源 Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级 ...

  7. kafka入门教程链接

    http://www.aboutyun.com/forum.php?mod=viewthread&tid=12882 经典入门教程 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创 ...

  8. 【Kafka入门】Kafka基础结构和知识

    基本概念的总结 在基本的Kafka架构中,producer将消息发布到Kafka话题中,一个Kafka话题通常指消息的类别或者名称,Kafka话题被集群中一个充当Kafka server角色的 bro ...

  9. Kafka 入门三问

    目录 1 Kafka 是什么? 1.1 背景 1.2 定位 1.3 产生的原因 1.4 Kafka 有哪些特征 消息和批次 模式 主题和分区 生产者和消费者 broker 和 集群 1.5 Kafka ...

随机推荐

  1. C# stopwatch的简单使用(计算程序执行时间)

    首先添加引用 using System.Diagnostics;//stopwatch的引用 //声明变量 Stopwatch a=new Stopwatch();//PS:这里一定要new(实例化) ...

  2. Iperius Backup Full--小中企业简单自动备份的实用工具

    从事IT行业几个年头了,一直以来发现备份这个词是十分特殊的.无论是事业国有大企央企还是个人爱好者,小型工作室,中小企业. 对于备份都是明确知道十分重要,但在正在实施起来会因为投入,领导重视程度,实施管 ...

  3. NOIP/CSP-S 考前注意事项

    NOIP/CSP-S 考前注意事项 实际操作与代码注意事项 基本内容 可以使用 #include <bits/stdc++.h>!!!从来都是可以的!!!不需要背诵一大串头文件,更不要从本 ...

  4. C++ 设计模式 2:创建型模式

    0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...

  5. CEF避坑指南(一)——编译并自制浏览器

    CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.我们可以从自制浏览器入手,深入学习它.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司, ...

  6. tp3.2 前端截取字符串

    在Common目录中建立 function.php <?php function subtext($text, $length) { if(mb_strlen($text, 'utf8') &g ...

  7. 自定义泛型方法, 三级排序, low版,待升级

    package com.jd.dashboard.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken ...

  8. Markdown语法+Typora快捷键

    1. Markdown语法 1.1 代码块生成 // 对于代码块,使用"```+编程语言"即可生成书写对应代码块的区域 // JS代码块 ​```javascript // Jav ...

  9. HashMap 链表插入方式 → 头插为何改成尾插 ?

    开心一刻 一天,楼主在路上碰到了一个很久没见的朋友,找了个餐馆,坐下聊了起来 楼主:在哪上班了 ? 朋友:火葬场啊 楼主:在那上班,一个月多少钱啊 ? 朋友:两万多啊 楼主(不可思议):多少 ? 朋友 ...

  10. 使用@Validated校验数据(除数据库做辅助)

    一.controller层 /** * 使用@Validated来进行校验 * @author HuangJingNa * @date 2019年12月23日 下午6:02:20 * * @param ...