我有一个基于快速框架的小型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更快地释放端口或一直重用相同的端口(这将是更好的解决方案)
由于
答案 0 :(得分:2)
目前,根据documentation
,我的解决方案是将agent
我的请求选项设置为false
选择退出与代理的连接池,默认请求连接:关闭。
因此我使用的端口数量不超过26,000 - 这仍然不是一个很好的解决方案,甚至更多,因为我不明白为什么重用端口不起作用,但它现在解决了这个问题。