我有一个基于快速框架的小型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 – 这仍然不是一个很好的解决方案,甚至更多,因为我不明白为什么重用端口不起作用,但它现在解决了这个问题.