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
,然后就卡住了。
我的问题是:
- 这里发生了什么事?
- 这些连接最终会closures吗? 要么:
- 我的服务器现在是否重新启动?
额外:
您可以将-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,以确定这是一个可生存的错误还是会级联失控,直到您的服务器耗尽资源。