永远或领域 – 它们哪个更适合node.js连续工作

我希望我的节点应用程序不断运行。 我敢肯定,应用程序的工作过程中可能会出现一些崩溃。 现在我可以看到3种使应用程序连续工作的方法:

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

问题是:这3种方法哪一种更好用。 在我看来,这个问题没有确切的答案,所以任何意见都是值得欢迎的。

在我看来,第一个更合适,因为节点进程内存消耗不会随着时间而增长 – 每次节点进程崩溃永远开始另一个。

啊,这是一个棘手的问题。 首先, domains方法与forever不同,因为它不会强制重新启动整个Node进程。 比方说,你的Node应用程序同时处理来自多个客户端的请求。 通过仔细configuration您的域名,您(至less在理论上)将能够防止其中一个请求抛出错误时失败的其他请求。

但是,实际上,为了让域名工作,应用程序的某些组件必须是domain感知的。 这也适用于第三方组件。 例如,在内部使用连接池的数据库连接模块不应将其包装到自己的域中,而应该检查callback是否已经附加了一个域。 否则,数据库代码中抛出的exception将被捕获到模块自己的域中,您的域将不知道它。 因此,为了使用第三方代码的域名,如果代码是用domains编写的,就必须首先进行攻击。

forever只要重新启动应用程序,每当它崩溃。 这听起来像是一个比domains更糟的想法,但它也不会对第三方代码施加任何特定的要求。 因此,你可以使用任何你想要的库或模块。 您也不必将任何复杂的错误恢复逻辑放入代码中。 有时候有一个简单的代码库比非复杂的代码更重要。

至于process.on('uncaughtException')我不会使用它。 现在已经废弃了,所以在某个时候可能会被删除。


这是我的细节:

  1. forever

    优点:

    • 让你保持你的代码库更简单和更小
    • 允许您先编写应用程序逻辑,然后再考虑error handling

    缺点:

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

    使用时:

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

    优点:

    • 破坏的请求不会破坏其他客户端
    • 节点进程保持更长时间,减less整体停机时间
    • 另请参阅domains+cluster组合(谢谢,Isaac!)

    缺点:

    • 可以与感知域的第三方库一起使用
    • 在你的程序中需要额外的逻辑

    使用时:

    • 您的请求或您的节点进程是昂贵的(例如file upload,stream数据)
    • 单节点正常运行很重要
  3. process.on('uncaughtException')不使用它。


笔记

  1. Isaac Z. Schlueter和FelixGeisendörfer在第十三集 NodeUp中讨论了域

  2. 最近有一篇文章解释了forever和Unix系统之间的区别 。 你可能会觉得它很有用。