如何实现持久的ConcurrentQueue?

时间:2013-11-27 19:17:41

标签: c# queue

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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