Node.js大型应用程序的可靠性

我是Node.js的新手,目前正在质疑它的可靠性。

根据我目前看到的情况,似乎存在一个主要缺陷:任何未被捕获的错误/exception都会使服务器崩溃。 当然,你可以尝试对你的代码进行防弹testing,或者在关键领域尝试一下,但是几乎总是会有漏洞通过破解。 如果有问题的请求可能会影响所有其他请求,这似乎很危险。 有两个解决方法,我发现:

  1. 使用守护进程或像永远的模块来自动重启服务器,当它崩溃。 我不喜欢这件事的是,服务器仍然停留一两秒钟(对于一个大的网站,可能是数百(数千?)的请求)。

  2. 使用process.on('uncaughtException')捕获未捕获的exception。 这种方法的问题(据我所知)是没有办法得到引起exception的请求的引用。 所以这个特定的请求是挂起(用户看到加载指标,直到超时)。 但至less在这种情况下,其他无问题的请求仍然可以处理。

任何Node.js的老兵都可以参与吗?

对于自动重启和负载平衡,我build议你检查一下Learnboost的升降平衡器。

它允许您在负载均衡器后面重新加载一个worker,而不会丢失任何请求。 它停止向工作人员发送新的请求,但是对于已经被服务的现有请求,它提供了workerTimeout宽限期来等待请求完成,然后才真正closures进程。

你可能会调整这个策略也是由uncaughtException事件触发的。

你已经完全控制了基础过程,这是一个function。

如果将Node与Apache / PHP设置进行比较,后者实际上就相当于有一个简单的Node服务器,它将每个传入的请求发送到自己的进程,并在请求处理后终止。

如果你愿意,你可以在Node中进行设置,在很多情况下,这可能是一个好主意。 关于Node的好处是你可以打破这种模式,例如你可以让主进程或者其他永久进程在请求被传递给它的处理器之前进行会话处理。

节点是一个非常灵活的工具,如果你需要这种灵活性,这是很好的,但需要一些技巧来处理。

exception不会导致服务器崩溃,它们会引发exception。

node.js中导致整个过程的错误是一个不同的故事。

你最好的select(你应该使用任何技术),只是尽快testing你的应用程序,看看它是否适合。

未被捕获的exception,如果没有被捕获,会导致服务器崩溃。 就像调用一个拼错的函数。 我使用process.on('uncaughtException')来捕获这样的exception。 如果你使用这个,那么发送到process.on('uncaughtException')的错误信息量就会减less。

我通常包含一个像nomnom这样的模块来允许命令行标志。 我包含一个叫做--exceptions ,当它被设置时,绕过process.on('uncaughtException') 。 基本上,如果我看到未捕获的exception正在发生,那么我在开发过程中用--exceptions启动应用程序,以便在引发错误时不会被捕获,从而导致Node吐出堆栈跟踪,然后死亡。 这告诉你它发生了什么事,以及在什么文件中。

捕获exception是解决这个问题的一种方法。 但是,就像你说的那样,这意味着如果发生错误,可能会导致用户没有收到回应等等。 我真的会build议让错误崩溃的服务器。 (我在应用程序中使用process.on('uncaughtException') ,而不是web服务器)。 并永远使用。 事实是,networking服务器可能会崩溃,然后暴露你需要修复的东西。

假设您使用PHP而不是Node。 PHP不会突然崩溃服务器(因为它并不真正服务)。 它吐出真正丑陋的错误。 当然,这不会导致整个服务器停机,然后不得不恢复。 没有人希望他们的客户有任何停机时间。 但这也意味着一个问题将会持续下去,而且会不那么明显。 我们都看到有错误的网站,而且没有很快得到补丁。 如果这样一个错误是把所有东西都拿下来,那么它肯定会引起人们的注意。 你会看到它发生,并将跟踪该错误。

事实上,任何系统中都会存在错误,不受语言或平台的影响。 而且,为了让你知道他们的事情,他们可能是致命的。 随着时间的推移,这会使您更加意识到这些错误是如何发生的。 我不了解你,但是我知道很多PHP开发人员一次又一次犯同样的错误。