Kafka 源代码分析之Message
这里主要分析一下message的格式.
一条message的构成由以下部分组成
val CrcOffset = 0 //crc校验部分和字长
val CrcLength = 4
val MagicOffset = CrcOffset + CrcLength //消息协议版本和字长
val MagicLength = 1
val AttributesOffset = MagicOffset + MagicLength //独立版本,压缩类型之类的标识和字长
val AttributesLength = 1
val KeySizeOffset = AttributesOffset + AttributesLength //key标识和字长
val KeySizeLength = 4
val KeyOffset = KeySizeOffset + KeySizeLength
val ValueSizeLength = 4 //消息内容长度标识和字长
由上面可看出一个消息的内容部分的起始位置实际上是keyoffset+keysize+valuesizeLength
def keySize: Int = buffer.getInt(Message.KeySizeOffset) //获取key大小
private def payloadSizeOffset = Message.KeyOffset + max(0, keySize) //加上key大小
private def sliceDelimited(start: Int): ByteBuffer = {
val size = buffer.getInt(start) //获取消息内容长度
if(size < 0) {
null
} else {
var b = buffer.duplicate
b.position(start + 4) //加上内容长度的字节数.
b = b.slice()
b.limit(size)
b.rewind
b //返回消息内容对应的buffer
}
}
一条完整的消息由上面几部分组成.
这里是用java实现的一个打印log文件里的offset和对应消息的小工具.
https://github.com/cloud-zhao/java/blob/master/kafka/Kmessages.java
Kafka 源代码分析之Message的更多相关文章
- kafka 源代码分析之Message(v0.10)
这里主要更新一下kafka 0.10.0版本的message消息格式的变化. message 的格式在0.10.0的版本里发生了一些变化(相对于0.8.2.1的版本)这里把0.10.0的message ...
- Kafka 源代码分析之ByteBufferMessageSet
这里分析一下message的封装类ByteBufferMessageSet类 ByteBufferMessageSet类的源代码在源代码目录message目录下.这个类主要封装了message,mes ...
- Kafka 源代码分析.
这里记录kafka源代码笔记.(代码版本是0.8.2.1) kafka的源代码如何下载.这里简单说一下. git clone https://git-wip-us.apache.org/repos/a ...
- Kafka 源代码分析之LogManager
这里分析kafka 0.8.2的LogManager logmanager是kafka用来管理log文件的子系统.源代码文件在log目录下. 这里会逐步分析logmanager的源代码.首先看clas ...
- Kafka 源代码分析之FileMessageSet
这里主要分析FileMessageSet类 这个类主要是管理log消息的内存对象和文件对象的类.源代码文件在log目录下.这个类被LogSegment类代理调用用来管理分片. 下面是完整代码.代码比较 ...
- Kafka 源代码分析之LogSegment
这里分析kafka LogSegment源代码 通过一步步分析LogManager,Log源代码之后就会发现,最终的log操作都在LogSegment上实现.LogSegment负责分片的读写恢复刷新 ...
- Kafka 源代码分析之Log
这里分析Log对象本身的源代码. Log类是一个topic分区的基础类.一个topic分区的所有基本管理动作.都在这个对象里完成.类源代码文件为Log.scala.在源代码log目录下. Log类是L ...
- Kafka 源代码分析之MessageSet
这里分析MessageSet类 MessageSet是一个抽象类,定义了一条log的一些接口和常量,FileMessageSet就是MessageSet类的实现类.一条日志中存储的log完整格式如下 ...
- Kafka 源代码分析之log框架介绍
这里主要介绍log管理,读写相关的类的调用关系的介绍. 在围绕log的实际处理上.有很多层的封装和调用.这里主要介绍一下调用结构和顺序. 首先从LogManager开始. 调用关系简单如下:LogMa ...
随机推荐
- Redis学习-Sentinel
Redis的Sentinel系统用于管理多个Redis服务器(instance), 该系统执行以下三个任务: 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正 ...
- Java_中建立0-10M的消息(字符串)
直接用StringBuilder,它的append方法方便快速构建字符串. StringBuilder sb1=new StringBuilder(); for(int i=0;i<1024*1 ...
- JavaScript window与undefined作为参数的作用
1.原函数 输出结果:1 如图: 2.加window的参数 输出结果:window对象 如图: 注意:此时的window不是全局变量,而是局部变量 3.关于形参必须传window么?当然是不需要的 输 ...
- java 线程方法join的简单总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- Zepto源码分析-callbacks模块
// Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT licens ...
- Swoole笔记(二)
本文示例代码详见:https://github.com/52fhy/swoole_demo. Task 我们可以在worker进程中投递一个异步任务到task_worker池中.此函数是非阻塞的,执行 ...
- 如何通过JS实现简单抖动效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- PHPstrom的Disable Power Save Mode
1.安装好phpstorm之后 发现代码高亮和函数自动提示都失效了 网上有人说可能是Power save mode的原因开始没找到这个设置在哪 后来在底部面板的信息提示处发现有一条系统消息: 17:0 ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- php面向对象2
类与对象的区别和联系 通过 http://www.cnblogs.com/we-jack/p/object.html 和 http://www.cnblogs.com/we-jack/p/php.ht ...