【问题标题】:Best practices to prevent Node.js PRODUCTION server's crash due to an unknown and un-handled exception防止 Node.js PRODUCTION 服务器因未知且未处理的异常而崩溃的最佳实践
【发布时间】:2023-03-14 19:16:01
【问题描述】:

防止 Node.js PRODUCTION 服务器因未知且未处理的异常而崩溃的最佳做法是什么?

【问题讨论】:

  • 最佳实践是 DOMAIN with Cluster。见this问题

标签: node.js


【解决方案1】:

如今,“快速失败”的心态风靡一时。你不能阻止它崩溃……你让它崩溃,然后有逻辑记录错误,通过电子邮件或文本通知你,然后优雅地恢复。这是我的做法:

使用 systemd 进行部署(新贵也可以,但已失宠)。确保在你的 .system 文件中有重启逻辑。将您的节点程序部署为 Docker 容器。当它失败时,容器将退出,systemd 会注意到它并重新启动。我还使用日志记录即服务,这样我就可以拥有所有日志。最后,我们使用警报机制(nagios、stackdriver,还有很多其他机制),以便我们知道什么时候出现故障。

您要求最佳实践,而这正是很多人现在正在做的事情。但它很贵。如果你没有任何金钱、时间或程序员来做这些事情,你就需要妥协。

不过,我不会在其中一些问题上妥协:

  1. 记录失败。大多数 SaaS 日志记录公司都有免费计划,所以请使用它。

  2. 监视您的进程并重新启动它的东西。在操作系统级别上,Upstart 和 Systemd 相当容易配置。但如果你不能,至少使用节点的“永远”包。

如果你不能像上面那样做任何事情并且真的已经触底,请将它放在你的节点应用程序的入口点:

process.on('uncaughtException', function(err) {
  //do something here
});

但实际上,您希望失败并恢复,从中吸取教训,修复错误,这将使您的软件更强大。

【讨论】:

  • 感谢您提供详细信息。我目前正在使用“永远”。实际上,我的 Node.js 服务器需要与 TCP 上的大量用户保持持久连接,以便实时发送推送消息。服务器的任何重新启动都会断开所有连接,然后所有连接都必须重新连接。这对我的应用程序来说是不可取的。我在应用程序中做了很多异常处理,但担心任何未知和未处理的异常。 process.on('uncaughtException', function(err) ....很多地方都提到过但不推荐使用。
  • 您可以在负载均衡器后面水平扩展。您仍然会在故障转移时失去连接,但您会更稳定。 AWS 和 GCE 都有不错的。 HaProxy 也不错。由于您正在进行消息传递,您可能希望利用相当稳定的消息代理,例如 0MQ 甚至 RabbitMQ,后者将允许您恢复“失败”消息。最后,重新初始化 TCP 连接通常是客户端的工作。因此,您可能希望在客户端应用程序上编程 TCP 重新连接,而不是您的服务器端代码。失败的代码,而不是完美的代码。
  • 幸运的是,我已经按照您的建议做了,在水平可扩展 Node.js 服务器和用于消息传递的 RabbitMQ 前面使用 HAProxy 作为负载平衡器。此外,客户端设计用于在发生任何连接故障时重新连接...感谢您提供更多详细信息....我应该使用“process.on('uncaughtException'...”来防止服务器崩溃和日志异常吗?以后再修?
  • 务实地说,我会说不。快速失败。但我知道生产崩溃是什么感觉,以及它在工作中引起的怪异场景。您不想为了遵守流行的口头禅而损失金钱或客户。所以是的。如果它是刺激物并且您处于困境中,请使用它。但是要明智地使用它并疯狂地记录,这样您就可以解决根本问题而不是掩盖它。祝你好运!
  • uncaughtException 方法不是一个好习惯。看到这个问题stackoverflow.com/questions/5999373/…
猜你喜欢
  • 2011-02-22
  • 2020-01-25
  • 2011-11-10
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多