Node.js(&MongoDB)服务器崩溃,数据库操作中途?

我有一个node.js应用程序与mongodb后端去一周生产,我对如何处理应用程序崩溃和重新启动有一些怀疑。

说我有一个简单的路线/followUser我有2个数据库操作

 /followUser ----->Update User1 Document.followers = User2 ----->Update User2 Document.followers = User1 ----->Some other mongodb(via mongoose)operation 

如果发生服务器崩溃(由于电源故障或远程mongodb服务器closures),会发生什么情况,如下所示:

 ----->Update User1 Document.followers = User2 SERVER CRASHED , FOREVER RESTARTS NODE 

下面的这些操作会发生什么? 系统现在处于不一致的状态,每当我要求User2的追随者时,我可能会有错误

 ----->Update User2 Document.followers = User1 ----->Some other mongodb(via mongoose)operation 

另外请推荐良好的日志logging,并重新启动/监视模块的Linux应用程序运行。

现在即时使用域来捕获exception,做server.close,但在process.exit()之前,我想确保所有的数据库事务完成,我可以通过testing,如果事件循环是空的或不(如何? ),然后process.exit(1)?

你需要这个事务,因为MongoDB没有他们在这里是一个解决方法http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

解决这个问题的一个方法是将清理代码添加到应用程序启动时运行的应用程序中。 您可以编写清理代码对数据的任何部分执行健全性检查,这些部分可以像您的示例一样通过多个步骤进行更新,然后以任何对您的应用程序有意义的方式修复该数据。

根据您的应用程序/数据的复杂性,这可能还需要您logging应用程序正在执行的操作的日志,但这会变得非常复杂。 理想的情况是更新非规格化数据和删除部分数据。

你想在启动过程中这样做,而不是closures,因为不能保证你的closures代码将完全运行,如果你因为一个exception而closures,你不知道你的系统在那个时刻是什么状态。

在这个链接中 vkurchatkin给出的解决scheme是一个解决方法,以防您的应用程序服务器崩溃,因为您将能够知道当时哪些事务处于待处理状态。 如果你在你的代码中实现这个,你可以在你的系统重启时创build清理代码,如JohnnyHK所build议的。 你提到的代码(捕获exception,在closures时testing等)将无法正常工作,因为…你的服务器崩溃了! 😉

也就是说,这是使用数据库完成的,因此您必须保证数据库不会崩溃。 我会build议你使用复制 。 它基本上是一个服务器集群,如果一个节点发生故障,可以恢复自己,也可以进行一些检查,以确保数据到达服务器,并且是安全的。

希望这可以帮助。