kafka01-Log

本文详细介绍了消息处理系统中消息的构建、压缩、存储及检索等核心操作过程。包括消息的构建方法、CRC32校验计算、消息集的创建与使用、文件消息集的读写操作以及日志段的管理和维护等内容。

message

//构建
public Message(byte[] content, byte[] key, CompressionCodec codec, int payloadOffset, int payloadSize);

//计算CRC32
public Long computeChecksum();

//校验CRC32是否正确
public boolean isValid();

//size
public int size() {return buffer.limit();}

messageSet

int MessageSizeLength = 4;
int OffsetLength = 8;
int LogOverhead = MessageSizeLength + OffsetLength;

//计算消息占用空间大小
public static Integer entrySize(Message message) {
     return LogOverhead + message.size();
}

ByteBufferMessageSet

//创建ByteBufferMessageSet
ByteBuffer create(AtomicLong offsetCounter, CompressionCodec compressionCodec, Message... messages);

//message写入buffer
public static void writeMessage(ByteBuffer buffer, Message message, Long offset) {
     buffer.putLong(offset);
     buffer.putInt(message.size());
     buffer.put(message.buffer);
     message.buffer.rewind();
 }

//解压缩
ByteBufferMessageSet decompress(Message message);

//写入channel(file/socket),offset没有用到
Integer writeTo(GatheringByteChannel channel, Long offset, Integer maxSize);   

//深迭代器
Iterator<MessageAndOffset> iterator() {return internalIterator(false);}

//浅迭代器
Iterator<MessageAndOffset> shallowIterator() {return internalIterator(true);}

//指定offset自增
ByteBufferMessageSet assignOffsets(AtomicLong offsetCounter, CompressionCodec codec)

FileMessageSet

//构建
FileMessageSet(File file, FileChannel channel, Integer start, Integer end, Boolean isSlice);

//读取数据,其实就是找区间new FileMessageSet()
FileMessageSet read(Integer position, Integer size);

//顺序读取查找
OffsetPosition searchFor(Long targetOffset, Integer startingPosition);

//写入channel(transferTo)
Integer writeTo(GatheringByteChannel destChannel, Long writePosition, Integer size);

//迭代器
Iterator<MessageAndOffset> iterator(final Integer maxMessageSize);

//写入到磁盘
void append(ByteBufferMessageSet messages);

//数据刷到磁盘
void flush();

//截断到targetSize
Integer truncateTo(Integer targetSize);

//读取信息到buffer
ByteBuffer readInto(ByteBuffer buffer, Integer relativePosition) 

LogSegment

//构建
LogSegment(FileMessageSet log, OffsetIndex index, Long baseOffset, Integer indexIntervalBytes, Long rollJitterMs, Time time);

//size
Long size() { return log.sizeInBytes().longValue();}

//插入message。调用log.append(msg)。根据indexIntervalBytes插入index。
void append(Long offset, ByteBufferMessageSet messages);

//查找。先index定位到offset附近,再log顺序查找
OffsetPosition translateOffset(Long offset, Integer startingFilePosition) {
   OffsetPosition mapping = index.lookup(offset);
   return log.searchFor(offset, Math.max(mapping.position, startingFilePosition));
}

//读取(优先用maxOffset作为最大长度)
//@threadsafe
FetchDataInfo read(Long startOffset, Optional<Long> maxOffset, Integer maxSize);

//重建遍历生成index。截断到maxMessageSize内的validBytes
Integer recover(Integer maxMessageSize);

//就是把end到offset的起始位置;
//log/index都截断
Integer truncateTo(Long offset);

//读取最后一个offset,返回它的offset+1
Long nextOffset();

//log和index flush()
@threadsafe
void flush();

//log和index delete()
void delete();

void setLastModified(Long ms);

OffsetIndex

//构建
OffsetIndex(File file, Long baseOffset, Integer maxIndexSize){
     MappedByteBuffer idx = randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, len);
     ...
}

//获取最后一个entry。根据size.get()
OffsetPosition readLastEntry();

//二分法查找
OffsetPosition lookup(Long targetOffset);

//获取offset
Integer relativeOffset(ByteBuffer buffer, Integer n);

//获取log文件中实际的position位置
Integer physical(ByteBuffer buffer, Integer n);

//获取第n个元素索引
OffsetPosition entry(Integer n);

//插入索引
void append(Long offset, Integer position);

//索引个数是否已满
boolean isFull();

//二分法查找后,调用下面方法
void truncateTo(Long offset);
void truncateToEntries(Integer entries);

//重新调整index大小、个数position沿用旧的。并关闭RamdomAccessFile
void resize(Integer newSize);

//强制清空directBuffer
void forceUnmap(MappedByteBuffer m){
  ((DirectBuffer) m).cleaner().clean();
}

void flush() { Utils.inLock(lock, () -> mmap.force());}

Log

//构建
Log(File dir, LogConfig config, Long recoveryPoint, Scheduler scheduler, Time time);

//获取当前segment
LogSegment activeSegment() {
    return segments.lastEntry().getValue();
}

Collection<LogSegment> logSegments() {
        return segments.values();
    }
Collection<LogSegment> logSegments(Long from, Long to);    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值