Persistent Queue的实现方式:
1)Berkeley DB,一个基于文件的高效的key-value store。需要一个从key-value 存取系统到 FIFO存取系统的转换。维护一个自增的Long型的key,队头就是最小的key,队尾就是最大的key。
2)paged file。队列由一系列文件或者块组成,只有第一个块和最后一个块是hot的,需要map到memory里
队头:第一个块 :offset
队尾:最后一个块 :offset
Enqueue:从最后一个块的offset处写,如果offset达到块大小,另起一个新块
Dequeue:从第一个块的offset处读,如果offfset到达第一块末尾,删除当前块,读入下一个块,offset置为0,继续读
并发:一般情况,dequeue和enqueue是不同的块,不需要互斥, 当然enqueue之间需要互斥。队列只有一个块的情况下,退化成数组队列。
分布式扩展:
1)类似merge k sorted list那样,可以配多个队列,进队的时候round robbin或者随机,出队的时候比较k个队列的队头时间戳(序列号),选最小,或者也round robbin,和入队的顺序一样,这样就把一个逻辑队列分部到多台机器上。
2)message 是有key的,按key就映射到不同server上的queue
http://bulldog2011.github.io/blog/2013/03/27/the-architecture-and-design-of-a-pub-sub-messaging-system/