kafka本地存储2-message
来源:互联网 发布:西直门桥设计数据 编辑:程序博客网 时间:2024/06/11 16:35
Message
MinHeaderSize=CrcLength+MagicLength+AttributesLength+KeySizeLength+ValueSizeLength
1. 4 byte CRC32 of the message
消息的字节内容buffer进行crc32编码,从magic之后的内容进行编码
Utils.crc32(buffer.array,buffer.arrayOffset +MagicOffset, buffer.limit -MagicOffset)
2. 1 byte "magic" identifier to allow format changes, value is 2 currently
3. 1 byte "attributes” 存的是消息的压缩类型 attributes= (attributes| (CompressionCodeMask& codec.codec)).toByte
GZIPCompressionCodec codec=1 name="gzip"
SnappyCompressionCodec codec=2 name="snappy"
LZ4CompressionCodec codec=3 name="lz4"
NoCompressionCodec codec=0 name="none"
4. 4 byte key length, containing length K 如果该消息没有key值,那length设置为-1
5. K byte key 消息key的字节内容,如果length为-1,表示没有这个key的字节内容,跳过
6. 4 bytepayload length, containing length V
7. V bytepayload 消息value的字节内容
MessageAndOffset
classMessageAndOffset(message: Message,offset: Long)
MessageAndOffset.nextOffset = offset+ 1 得到这个MessageAndOffset的下一个偏移量offset
MessageAndMetadata
classMessageAndMetadata[K, V](topic: String,partition: Int,
private val rawMessage: Message,offset: Long,
private val rawMessage: Message,offset: Long,
keyDecoder: Decoder[K],valueDecoder: Decoder[V])
MessageAndMetadata包含了这个message所属的topic和partition,在partition的消息偏移量offset
这个message的key的类型是K
这个message的value类型是V
MessageSet
LogOverhead=OffsetLength+ MessageSizeLength
MessageSizeLength=4 messge占用的字节大小
OffsetLength=8 message在partition里的消息偏移量
MessageSet中每个结构由LogOverhead和message组成
ByteBufferMessageSet
ByteBufferMessageSet.create(offsetCounter: AtomicLong, compressionCodec: CompressionCodec, messages: Message*)
create方法把Message集合写入字节流中,每个消息存的是OffsetLength + MessageSizeLength +消息的字节长度来写入这个压缩buff
其中offset存的是offsetCounter参数的递增值,每个消息写入形如writeMessage(buffer,message, offsetCounter.getAndIncrement)
如果需要压缩存储,把Message集合按照compressionCodec压缩到中,bytes之后message=newMessage(bytes, compressionCodec)创建一个message,
把这一个message写入到buff中
ByteBufferMessageSet.shallowValidBytes表示每个消息占用的总字节的大小,如果是消息被压缩,需要解开后累加每个消息的字节大小
ByteBufferMessageSet.internalIterator 遍历这个集合时,如果是compressionCodec,就先解码,之后再进行遍历
FileMessageSet
class FileMessageSetprivate[kafka](@volatilevarfile: File,
private[log]valchannel: FileChannel,
private[log] val start: Int,
private[log] val end: Int,
private[log] val start: Int,
private[log] val end: Int,
isSlice: Boolean)extendsMessageSet
FileMessageSet.searchFor返回的是OffsetPosition
//offset是在partition中的消息绝对位移
//position是partition中片段segment的物理的字节偏移量
//position是partition中片段segment的物理的字节偏移量
caseclassOffsetPosition(valoffset: Long,valposition: Int)
FileMessageSet.iterator 返回的类型是MessageAndOffset
0 0
- kafka本地存储2-message
- kafka本地存储3-LogSegment
- kafka本地存储4-LogCleaner
- kafka本地存储5-LogManager
- 3、Kafka的message存储数据结构
- kafka本地存储1-配置说明
- Kafka message协议和存储 (0.7版本)
- Kafka学习总结(三)——Kafka的message存储数据结构
- Kafka消息时间戳(kafka message timestamp)
- Kafka中的Message Delivary机制
- kafka本地搭建流程
- ios 本地存储 (2)数据库存储
- iOS本地存储2--CoreData存储数据
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- Socket中send函数的理解
- 获取wifi的ip地址
- 查看等待事件
- 58同城沈剑:好的架构源于不停地衍变,而非设计(转载)
- FFT在DSP28335中的使用
- kafka本地存储2-message
- 王学岗Fragment(二)
- php遇到error提示问题
- HorizontalScrollView实现listView 横向滑动
- linux发行版和内核的关系
- [从头学数学] 第65节 四则运算
- xcode 常见的快捷方式组合
- Android 使用ViewPager实现左右循环滑动图片和显示当前页码
- HDU-4932-Miaomiao's Geometry【暴力枚举】