我希望我的节点应用程序连续运行。我确信在应用程序工作期间可能会出现一些崩溃。如今,我可以看到 3 种使应用程序持续运行的方法:
问题是:这三种方式中哪一种更好用。在我看来,这个问题没有确切的答案,所以欢迎任何评论。
在我看来,第一个更合适,因为节点进程的内存消耗不会随着时间的推移而增长——每次节点进程永远崩溃都会启动另一个。
我希望我的节点应用程序连续运行。我确信在应用程序工作期间可能会出现一些崩溃。如今,我可以看到 3 种使应用程序持续运行的方法:
问题是:这三种方式中哪一种更好用。在我看来,这个问题没有确切的答案,所以欢迎任何评论。
在我看来,第一个更合适,因为节点进程的内存消耗不会随着时间的推移而增长——每次节点进程永远崩溃都会启动另一个。
啊,这是一个棘手的问题。首先,domains
方法的不同之处forever
在于它不会强制您重新启动整个 Node 进程。例如,您的 Node 应用程序同时处理来自多个客户端的请求。通过仔细配置您的域,您(至少在理论上)将能够防止其他请求在其中一个请求引发错误时失败。
然而,在实践中,要让域工作,您的应用程序的某些组件必须是 -domain
感知的。这也适用于第三方组件。例如,一个在内部使用连接池的数据库连接模块不应该将它们包装到它自己的域中,而是检查回调是否已经附加了一个域。否则,数据库代码中抛出的异常将被模块自己的域捕获,而您的域不会知道它。因此,为了使用带有第三方代码的域,您必须首先检查该代码是否是domains
在考虑到该代码的情况下编写的。
forever
只需在应用程序崩溃时重新启动它。这听起来比 更糟糕domains
,但它也没有对第三方代码强加任何特定要求。因此,您可以使用任何您想要的库或模块。您也不必将任何复杂的错误恢复逻辑放入您的代码中。有时拥有一个简单的代码库比拥有一个不失败但复杂的代码库更重要。
至于process.on('uncaughtException')
我不会用。它现在已被弃用,因此它可能会在某个时候被删除。
forever
domains
domains+cluster
组合(谢谢,艾萨克!)process.on('uncaughtException')
不要使用它。
最近forever
systemd
有一篇文章解释了Unix 和. 您可能会发现它很有用。