用于读/写的最快的大型队列机制

时间:2012-03-21 18:26:19

标签: java performance queue

我需要一个按顺序写入的系统,非常快速地写入同步的持久队列并从中快速读取。队列可能会飙升并增长到数亿,在某些日子可能会有数十亿条目,之后可能需要数天才能赶上,这很好。

我在考虑这样的事情:

接收包含数字0-4的多个请求(顺序无关紧要)

Queue[10]: [ 0 1 2 3 4 _ _ _ _ _ ] 

队列也写入文件(f0),同时提交给队列。这样做的原因是在失败的情况下我不会丢失数据。

当我按顺序(0,1,2)读取它时,会发布更多数字:

Queue[10]: [ _ _ _ 3 4 5 6 7 _ _ ] 

此时我的文件f0包含(0-7)并且我还保持最后一个位置读取。

如果我继续写入并且当前队列已满,则接下来的10次写入直接进入文件f1。接下来的10个将进入f2,依此类推。当读数完成读取时,队列f1中的所有条目将被加载到队列中并且读取将继续。 f0将被删除。当我的读取赶上写入时,当前文件将被读入队列并将从该点继续。

我可以通过使用主要/辅助缓冲区来提供更好的实现。

但是,如果有一个可以满足我需要的库,我宁愿使用现有的库。

非常感谢任何帮助。

塞比

1 个答案:

答案 0 :(得分:8)

我有一个图书馆,它支持一个持久的队列,可以支持每秒500万到2000万的持续时间,并且可以在单个制作人和多个消费者之间拥有多少个人(他们甚至不必在同时)它没有任何GC开销。

https://github.com/peter-lawrey/Java-Chronicle

如果您想要更高的可伸缩性并且它受到您拥有的磁盘空间量的限制,那么该库需要64位JVM。

该库假定您将循环用作维护任务的文件。这要求您有足够的磁盘空间来覆盖维护窗口之间的时间段。