6

我希望我的节点应用程序连续运行。我确信在应用程序工作期间可能会出现一些崩溃。如今,我可以看到 3 种使应用程序持续运行的方法:

  1. 永远启动我的应用程序,所以当应用程序永远崩溃时会自动重新启动它
  2. 使用模块捕获错误并在发出“错误”事件时再次启动应用程序
  3. 弃用process.on('uncaughtException')

问题是:这三种方式中哪一种更好用。在我看来,这个问题没有确切的答案,所以欢迎任何评论。

在我看来,第一个更合适,因为节点进程的内存消耗不会随着时间的推移而增长——每次节点进程永远崩溃都会启动另一个。

4

1 回答 1

10

啊,这是一个棘手的问题。首先,domains方法的不同之处forever在于它不会强制您重新启动整个 Node 进程。例如,您的 Node 应用程序同时处理来自多个客户端的请求。通过仔细配置您的域,您(至少在理论上)将能够防止其他请求在其中一个请求引发错误时失败。

然而,在实践中,要让域工作,您的应用程序的某些组件必须是 -domain感知的。这也适用于第三方组件。例如,一个在内部使用连接池的数据库连接模块不应该将它们包装到它自己的域中,而是检查回调是否已经附加了一个域。否则,数据库代码中抛出的异常将被模块自己的域捕获,而您的域不会知道它。因此,为了使用带有第三方代码的域,您必须首先检查该代码是否是domains在考虑到该代码的情况下编写的。

forever只需在应用程序崩溃时重新启动它。这听起来比 更糟糕domains,但它也没有对第三方代码强加任何特定要求。因此,您可以使用任何您想要的库或模块。您也不必将任何复杂的错误恢复逻辑放入您的代码中。有时拥有一个简单的代码库比拥有一个不失败但复杂的代码库更重要。

至于process.on('uncaughtException')我不会用。它现在已被弃用,因此它可能会在某个时候被删除。


这是我的细分:

  1. forever

    优点:

    • 让你的代码库更简单更小
    • 允许您先编写应用程序逻辑,然后再考虑错误处理

    缺点:

    • 单个未捕获的异常导致所有其他请求失败

    在以下情况下使用:

    • 你的 Node 进程和你的请求很便宜
    • 客户端可以重试错误
  2. domains

    优点:

    缺点:

    • 可以与域感知的 3rd-party 库一起使用
    • 在你的程序中需要额外的逻辑

    在以下情况下使用:

    • 您的请求或您的节点进程很昂贵(例如文件上传、流数据)
    • 单节点正常运行时间很重要
  3. process.on('uncaughtException')不要使用它。


笔记

  1. Isaac Z. SchlueterFelix Geisendörfer在NodeUp 第 13 集中谈到了域

  2. 最近foreversystemd有一篇文章解释了Unix 和. 您可能会发现它很有用。

于 2013-01-30T21:36:09.600 回答