我需要编写一个程序,在可能状态的大空间中执行并行搜索,在此过程中发现新的区域(并开始探索),对某些区域的探索会提前终止,因为在其他地方获得的中间结果消除了在其中发现新的有用结果的可能性。搜索是使用多个线程来执行的,这些线程彼此之间进行大量协作以避免重新计算中间数据。
复杂的内部状态(包括几个线程的调用堆栈和它们使用的状态同步原语)必须在整个过程中进行维护和更新,并且没有明显的方法将计算拆分为可以顺序执行的独立块,每个块都保存一个小的中间结果并将其传递给下一个。此外,没有办法将计算拆分为不相互通信的独立并行线程,而不会由于重新计算大量中间数据而带来过高的开销。
由于搜索范围很大,该程序可能会运行数月才能产生最终结果。因此,在程序执行过程中存在电源、硬件或操作系统故障的重大风险,这可能导致目前已完成的所有工作完全丢失。在这种情况下,程序将需要从头开始重新启动所有计算。
我需要一个解决方案,可以防止在这种情况下完全的数据丢失。我想到了一个执行引擎/平台,它可以不断地将进程的当前状态保存到一个抗故障的存储中,比如冗余磁盘阵列或数据库。但我知道,这种方法可以显著减慢过程,甚至在一定程度上,与预期的计算时间(包括由于可能的故障而重新启动)相比,没有任何好处。
事实上,我不需要一个理想的解决方案,连续保存程序状态,我可以轻松承受数小时甚至数天的工作损失。我想到的一个可能的重量级解决方案是在虚拟机内运行程序,不时保存其快照,并在最近的快照中可能出现主机故障后恢复机器。这种方法还可以帮助在随机或可预防的客户操作系统故障后恢复程序状态。
是否有类似但更轻量级的解决方案仅限于保留单个进程的状态?或者你能建议其他方法来解决我的问题吗?
您可能需要考虑使用Erlang,它允许以相对较低的成本运行大量线程。因为线程成本低,所以可以使用冗余来实现更高的可靠性。
对于您提出的问题,三重冗余方案可能是可行的,即定期检查三个(或多个)系统之间的同步将通过投票确定谁失败了。