nsq源码-diskqueue
nsq源码-diskqueue
有兴趣可以看看这篇文章
https://www.cnblogs.com/zhangboyu/p/7457070.html
一、队列存储
队列的特征是先入先出,也就是写入是从后面写入,读取是从前面读取
我们平时写的队列一般是放到内存里面,比如一个大的动态数组
这里如果队列中的数据很大,diskqueue则是将这个动态数组拆成了好多个文件来存储队列中的数据
如果队列是放在内存数组中,那么队列只需要记录两个属性,一个头的位置,一个是尾的位置,
队列大小depth = 头位置 - 尾位置
但是由于diskqueue是将数组保存在多个文件中
所以diskqueue就会有五个属性: 头所在的文件,头在文件中的位置,尾所在的文件,尾在文件中的位置,还有就是depth标识头和尾中间的数据数量
这五个数据作为diskqueue的元数据单独保存在一个文件里面。
所以New一个diskqueue的时候先要这几个元数据读取出来
1 | func New(name string, dataPath string, maxBytesPerFile int64, |
二、写入队列
1 | func (d *diskQueue) writeOne(data []byte) error { |
读取队列
1 | func (d *diskQueue) readOne() ([]byte, error) { |
1 | // 刷新缓存到磁盘 |
五、ioLoop循环
这个函数是一个“守护”协程,
暴露的d.writeChan和d.readChan
如果外部有网writeChan里写数据在这里处理
同时,这里的消息也会通过d.readChan将消息不断的从队列中往外推
1 | func (d *diskQueue) ioLoop() { |