go-diskqueue数据结构

ゞ 浴缸里的玫瑰 2022-12-01 12:21 147阅读 0赞

一、本文目的是介绍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元数据文件,记录着写了多少消息到磁盘,写到哪个编号文件了,读到哪个编号文件了,读的偏移量:

  1. _, err = fmt.Fprintf(f, "%d\n%d,%d\n%d,%d\n",
  2. d.depth, //落地消息个数
  3. d.readFileNum, d.readPos, //读文件编号,读文件的当前偏移量
  4. d.writeFileNum, d.writePos) //文件编号,写文件当前偏移量

20200828211233501.png

2.2.2数据文件,格式比较简单。限制单文件的大小,当文件大小达到阈值时,文件数据编号自增1:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaXl1ZG9uZzIwMjA_size_16_color_FFFFFF_t_70读取数据时,先读取消息长度,再读内容。

  1. // 先读出消息的大小
  2. err = binary.Read(d.reader, binary.BigEndian, &msgSize)
  3. if err != nil {
  4. d.readFile.Close()
  5. d.readFile = nil
  6. return nil, err
  7. }

总结

1.go-diskqueue代码量只有600多行,有比较多精妙设计,值得一看。

2.fsync在diskqueue中也会应用,尤其是元数据落地。

3.注意大小端问题

原文出自:https://blog.csdn.net/daiyudong2020/article/details/108250750

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构-图形结构

    数据结构-图形结构 树形结构的最大不同就是描述节点与节点直接“层次”的关系,但是图形结构却是讨论两个顶点之间“连通与否”的关系,如果为图形中连接两顶点的边填上加权值,这类

    相关 数据结构数据的存储结构

    数据有有线性结构、树形结构、图状结构和集合四种逻辑结构,那么它们是如何存储的呢? 数据结构的存储结构有两种,分别是顺序存储和链式存储。顺序存储的特点是借助元素在存储器中的相对