我需要一个按顺序写入的系统,非常快速地写入同步的持久队列并从中快速读取。队列可能会飙升并增长到数亿,在某些日子可能会有数十亿条目,之后可能需要数天才能赶上,这很好。
我在考虑这样的事情:
接收包含数字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将被删除。当我的读取赶上写入时,当前文件将被读入队列并将从该点继续。
我可以通过使用主要/辅助缓冲区来提供更好的实现。
但是,如果有一个可以满足我需要的库,我宁愿使用现有的库。
非常感谢任何帮助。
塞比
答案 0 :(得分:8)
我有一个图书馆,它支持一个持久的队列,可以支持每秒500万到2000万的持续时间,并且可以在单个制作人和多个消费者之间拥有多少个人(他们甚至不必在同时)它没有任何GC开销。
https://github.com/peter-lawrey/Java-Chronicle
如果您想要更高的可伸缩性并且它受到您拥有的磁盘空间量的限制,那么该库需要64位JVM。
该库假定您将循环用作维护任务的文件。这要求您有足够的磁盘空间来覆盖维护窗口之间的时间段。