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 +MagicOffsetbuffer.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,
                                   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,
                                    isSlice: Boolean)extendsMessageSet

FileMessageSet.searchFor返回的是OffsetPosition
//offset是在partition中的消息绝对位移
//position是partition中片段segment的物理的字节偏移量
caseclassOffsetPosition(valoffset: Long,valposition: Int)

FileMessageSet.iterator 返回的类型是MessageAndOffset

0 0
原创粉丝点击