程序失败时保存队列值的最佳方法

时间:2009-09-29 16:57:08

标签: multithreading sqlite queue reliability

假设我有一个由两个独立的线程和一个队列组成的多线程应用程序。线程1完成它的计算并将结果放入队列中。同时,线程2不断循环并检查队列中是否有任何数据要进行处理。

如果由于某种原因程序出现故障或计算机重新启动,如何将队列中的值暂时保存到磁盘?在第一个线程完成后将值保存在SQLite DB中然后在线程2完成后删除它是否合理?

如果SQLite实际上是最好的解决方案,是否可以更快地在一行上插入一个标志,说它已被处理并且每隔半小时有另一个线程,并删除那些被标记的行或者只是立即删除该行?

3 个答案:

答案 0 :(得分:2)

不要在这里自己动手。异步处理例程,可重启性,程序故障等最好使用消息队列进行管理。

您可以使用built-in one to Windows,使用来自Apache Software Foundation的ActiveMQ开源,或使用Amazon's Simple Queue Service利用云中的网络服务。

你可以去很多不同的方式。在自己重复功能之前,请调查这些选项。这些领域的可靠性比您预期的更具挑战性。

答案 1 :(得分:0)

我根本不会将队列存储在内存中 - 只需将它存储在SQL Lite上即可。如果线程1只是添加到队列而线程2是唯一一个读取,那么只需让线程2在处理完后立即删除该行。

当然,出于性能原因,线程2等待间隔在检查队列之前的时间越长越好。

答案 2 :(得分:0)

一种解决方案是使用队列服务器,例如Zero-MQ,RabbitMQ或(商业)Tibco EMS或Websphere MQ。