1

我有一个带有 mongodb 后端的 node.js 应用程序将在一周内投入生产,我对如何处理应用程序崩溃和重启几乎没有疑问。

假设我有一个简单的路线/followUser,其中我有 2 个数据库操作

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

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

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

下面这些操作会发生什么?系统现在处于不一致状态,每次我要求 User2 关注者时我可能都会出错

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

还请为在 linux 中运行的应用程序推荐良好的日志记录和重启/监控模块。

现在我使用域来捕获异常,执行 server.close ,但在 process.exit() 之前我想确保所有数据库事务都已完成,我可以通过测试事件循环是否为空来检查这一点(如何? ) 然后 process.exit(1) ?

4

3 回答 3

3

您需要为此进行事务处理,并且由于 MongoDB 在此处没有它们,因此这是一种解决方法http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

于 2013-10-20T09:58:08.220 回答
2

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

根据您的应用程序/数据的复杂性,这可能还需要您保留应用程序尝试执行的操作的日志,但这会很快变得复杂。理想情况下,更多的是刷新非规范化数据和删除部分数据。

您希望在启动而不是关闭期间执行此操作,因为无法保证您的关闭代码将完全运行,并且如果您因为异常而关闭,您不知道此时系统的状态。

于 2013-10-23T00:11:02.300 回答
1

vkurchatkin 在此链接中给出的解决方案是一种解决方法,以防您的应用服务器崩溃,因为您将能够知道当时哪些交易处于待处理状态。如果您在代码中实现这一点,您可以按照 JohnnyHK 的建议在系统重新启动时创建清理代码。您提到的代码(捕获异常,关闭时测试等)将无法正常工作,因为...好吧..您的服务器崩溃了!;-)

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

希望这可以帮助。

于 2013-10-25T21:09:01.387 回答