node.js – 在高负载下连接nodejs中的EADDRNOTAVAIL – 如何更快地释放或重用TCP端口?

我有一个基于快速框架的小型wiki web应用程序,它使用弹性搜索作为后端.对于每个请求,它基本上只进入弹性搜索DB,检索对象并返回由把手模板引擎呈现的对象.与弹性搜索的通信是通过HTTP进行的

只要我只运行一个node-js实例,这就很有效.在我更新代码以使用群集后(如nodejs-documentation中所述,我开始遇到以下错误:连接EADDRNOTAVAIL

当我运行3个或更多python脚本时,会出现此错误,这些脚本会不断从我的服务器检索一些URL.使用3个脚本我可以检索~45,000个页面,其中4个和更多脚本运行它在30,000到37,000个页面之间只运行2个或1个脚本,我在半小时后停止它们,分别检索310,000页和160,000页.

我发现这个similar question并尝试更改http.globalAgent.maxSockets,但没有任何效果.

这是代码的一部分,它侦听URL并从弹性搜索中检索数据.

app.get('/wiki/:contentId', (req, res) ->
    http.get(elasticSearchUrl(req.params.contentId), (innerRes) ->
        if (innerRes.statusCode != 200)
            res.send(innerRes.statusCode)
            innerRes.resume()
        else
            body = ''
            innerRes.on('data', (bodyChunk) ->
                body += bodyChunk
            )
            innerRes.on('end', () ->
                res.render('page', {'title': req.params.contentId, 'content': JSON.parse(body)._source.html})
            )
    ).on('error', (e) ->
        console.log('Got error: ' + e.message)  # the error is reported here
    )
)

更新:

在深入研究之后,我现在了解问题的根源.我运行命令netstat -an | grep -e tcp -e udp | wc -l在我的测试运行期间多次,看看有多少端口被使用,如Linux: EADDRNOTAVAIL (Address not available) error号文件所述.我可以观察到,当我收到EADDRNOTAVAIL错误时,使用了56677个端口(而不是通常使用~180)

此外,当仅使用2个同时脚本时,使用的端口数量大约为40,000(/ – 2,000),这意味着每个脚本使用约20,000个端口(这是node-js清除旧端口之前的时间.并且运行它的3个脚本超过56677端口(~60,000).这解释了为什么它失败了3个脚本请求数据,而不是2.

所以现在我的问题改为 – 如何强制node-js更快地释放端口或一直重用相同的端口(将是更好的解决方案)

谢谢

最佳答案 根据
documentation,我现在的解决方案是将我的请求选项的代理设置为false

opts out of connection pooling with an Agent, defaults request to Connection: close.

因此,我使用的端口数量不超过26,000 – 这仍然不是一个很好的解决方案,甚至更多,因为我不明白为什么重用端口不起作用,但它现在解决了这个问题.

点赞