Node.js GET Request ETIMEDOUT & ESOCKETTIMEDOUT

我使用Node.js – async & request模块来抓取超过1亿的网站,几分钟后我不断遇到错误ESOCKETTIMEDOUT & ETIMEDOUT。
我重新启动脚本后,它又可以工作了。这似乎不是连接限制的问题,因为我仍然可以做resolve4, resolveNs, resolveMx和curl没有延迟。
你觉得代码有什么问题吗?或任何建议吗?我希望将async.queue()并发性至少提升到1000。谢谢你!

And the system limits are pretty high.

sysctl

———- ———- ———- ———- ———-

默认情况下,Node有4个worker来解析DNS查询。如果您的DNS查询时间较长,请求将在DNS阶段阻塞,而问题正是ESOCKETTIMEDOUTETIMEDOUT

尝试增加你的uv线程池大小:

或index.js(或你的入口点):

还有一篇博文

———- ———- ———- ———- ———-

在阅读本文之后,通过使用request选项中的“agent: false”来解决这个问题

2017年10月31日上述最初的回应似乎并没有完全解决问题。我们找到的最终解决方案是在代理中使用keepAlive选项。例如:

Node的默认池似乎默认为keepAlive=false,这会导致在每个请求上创建一个新连接。如果在短时间内创建了太多的连接,就会出现上述错误。我的猜测是一个或多个路由器沿着路径到服务阻塞连接请求,可能在怀疑拒绝服务攻击。无论如何,上面的代码示例完全解决了我们的问题。

———- ———- ———- ———- ———-

相关知识:http://nodejs.cn/api/http.html#http_class_http_agent

原文:https://stackoverflow.com/questions/24320578/node-js-get-request-etimedout-esockettimedout

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in NodeJS and tagged , , by 织梦先生. Bookmark the permalink.