Node.js如何处理未封闭的HTTP响应

考虑一个简单的快速应用程序:

app.get '/hang', (req, res) -> console.log 'Request ', n n += 1 # res.send 200 

哎呀,我不小心把res.send了出来,好吧,让我们看看会发生什么!

如果我用浏览器打开/hang ,它就在那里旋转,这是有道理的。 没有send我们不closures连接(正确的假设?)。 让我们来看看如果我们用一堆同时连接进行连接 ,会发生什么情况:

 $ ab -n 1000 -c 1000 http://localhost:3000/hang Benchmarking localhost (be patient) apr_socket_recv: Connection reset by peer (104) 

该应用程序设法打印出几百个Request n ,然后就卡住了。

我的问题是:

  1. 这里发生了什么事?
  2. 这些连接最终会closures吗? 要么:
  3. 我的服务器现在是否重新启动?

额外:

您可以将-r传递给ab以使其忽略套接字错误。 当我使用的时候,我开始看到ab列出了一些要求完成:

 Completed 100 requests Completed 200 requests apr_pollset_poll: The timeout specified has expired (70007) 

这可能是由node.jsclosures的连接吗?

这里发生了什么事?

这些关系只是袖手旁观。 他们花费内存来保持开放,但CPU可以忽略不计。

这些连接最终会closures吗?

是的,我相信OS的networking层将最终closures他们的超时错误。 客户端或服务器都可以根据configuration(特别是保持活动和超时值)触发。

我的服务器现在是否重新启动?

不,你可以干净地从一定数量的这些没有重新启动恢复。 因此,如果在真正的服务器中,每1000个请求中有1个在没有响应的情况下挂起,那么对于给定的stream量负载,这个bug是可以pipe理的。 这基本上是每单位stream量和stream量负载的挂起连接的function,以确定这是一个可生存的错误还是会级联失控,直到您的服务器耗尽资源。