Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在高负载下连接nodejs中的EADDRNOTAVAIL-如何更快地释放或重用TCP端口?_Node.js_Express_Coffeescript_Port_Limit - Fatal编程技术网

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

Node.js 在高负载下连接nodejs中的EADDRNOTAVAIL-如何更快地释放或重用TCP端口?,node.js,express,coffeescript,port,limit,Node.js,Express,Coffeescript,Port,Limit,我有一个基于express框架的类似wiki的小型web应用程序,它使用弹性搜索作为后端。对于每个请求,它基本上只进入弹性搜索数据库,检索对象并返回由Handlebar模板引擎渲染的对象。与弹性搜索的通信是通过HTTP进行的 只要我只有一个节点js实例在运行,这就非常有效。更新代码以使用集群后(如中所述),我开始遇到以下错误:connect EADDRNOTAVAIL 当我运行3个或更多的python脚本,不断从我的服务器检索一些URL时,就会出现此错误。使用3个脚本,我可以检索约45000页,

我有一个基于express框架的类似wiki的小型web应用程序,它使用弹性搜索作为后端。对于每个请求,它基本上只进入弹性搜索数据库,检索对象并返回由Handlebar模板引擎渲染的对象。与弹性搜索的通信是通过HTTP进行的

只要我只有一个节点js实例在运行,这就非常有效。更新代码以使用集群后(如中所述),我开始遇到以下错误:connect EADDRNOTAVAIL

当我运行3个或更多的python脚本,不断从我的服务器检索一些URL时,就会出现此错误。使用3个脚本,我可以检索约45000页,运行4个或更多脚本。在30000到37000页之间,仅运行2或1个脚本,当他们检索310000页和160000页时,我在半小时后停止了它们分别

我发现了这一点,并尝试更改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
,以查看使用了多少端口,如文章中所述。我可以观察到,在收到EADDRNOTAVAIL错误时,使用了56677个端口(通常约180)

另外,当仅使用2个同步脚本时,使用的端口数饱和在40000(+/-2000)左右,这意味着每个脚本使用约20000个端口(即node js在创建新端口之前清理旧端口的时间),对于运行它的3个脚本,超过56677个端口(~60000个)。这解释了为什么它在3个脚本请求数据时失败,而在2个脚本请求数据时失败

因此,现在我的问题变为-如何强制node js更快地释放端口或始终重用同一端口(这将是更好的解决方案)


现在非常感谢,我的解决方案是将我的请求选项的
代理设置为
false
,根据

选择与代理脱离连接池,默认请求连接:关闭

因此,我使用的端口数没有超过26000个-这仍然不是一个很好的解决方案,更重要的是,我不明白为什么重用端口不起作用,但它现在解决了问题