go-diskqueue数据结构
一、本文目的是介绍go-diskqueue
go-diskqueue,应用于nsq:https://github.com/nsqio/nsq,作用是存储内存装不下的消息到磁盘,并支持读取。
go-diskqueue:https://github.com/yudongdai/go-diskqueue/blob/master/diskqueue.go(注释版)
二、文件的组织
2.1文件的组成
2.1.1 元数据,文件名格式如下:{TopicName}.diskqueue.meta.dat,每个Topic只会存在1个文件
2.1.2 文件数据,文件名格式如下:{TopicName}.diskqueue.{num}.dat,因为限制了单文件大小,每个Topic只会存在多个文件,当一个文件按编号递增
2.2数据结构
2.2.1元数据文件,记录着写了多少消息到磁盘,写到哪个编号文件了,读到哪个编号文件了,读的偏移量:
_, err = fmt.Fprintf(f, "%d\n%d,%d\n%d,%d\n",
d.depth, //落地消息个数
d.readFileNum, d.readPos, //读文件编号,读文件的当前偏移量
d.writeFileNum, d.writePos) //文件编号,写文件当前偏移量
2.2.2数据文件,格式比较简单。限制单文件的大小,当文件大小达到阈值时,文件数据编号自增1:
读取数据时,先读取消息长度,再读内容。
// 先读出消息的大小
err = binary.Read(d.reader, binary.BigEndian, &msgSize)
if err != nil {
d.readFile.Close()
d.readFile = nil
return nil, err
}
总结
1.go-diskqueue代码量只有600多行,有比较多精妙设计,值得一看。
2.fsync在diskqueue中也会应用,尤其是元数据落地。
3.注意大小端问题
原文出自:https://blog.csdn.net/daiyudong2020/article/details/108250750
还没有评论,来说两句吧...