如何实现持久化并发队列



我有一个简单的消息队列类型实现,它使用ConcurrentQueue对消息进行排队。我需要在崩溃的情况下坚持这一点,但似乎找不到一个好的持久队列实现。有什么建议吗?

我过去做过的一件事是使用真正的低技术解决方案。每次向队列添加项目或从队列中删除项目时,我都会在文件中写入一个条目。文件一开始是空的。然后我有:

add item 1
add item 2
remove item 1
add item 3
remove item 2
remove item 3
add item 4
...

对于崩溃恢复,我打开文件并从顶部读取,添加和删除内容,直到到达文件末尾。

当程序正常关闭时,它会写入一个新文件,其中包含表示队列当前状态的"添加"记录。程序下次启动时,会加载文件以初始化队列。

这对我的应用程序来说效果很好,但队列并不是很大。我对它进行了一些修改,使它能够定期输出完整的队列内容并销毁任何历史记录。这样做的主要原因是减少磁盘空间的使用量,并在崩溃时加快加载时间。

另一种可能性是在磁盘上使用循环队列,尽管这可能很痛苦。除非您可以设置最大队列大小,并且记录是固定长度(或者您知道最大长度),否则管理文件将变得极其复杂。在这一点上,简单的数据库实现要好得多。

文件系统没有"在前端截断文件"功能,这真的太糟糕了。因为如果他们这样做了,那么实现持久队列将是微不足道的。

最新更新