Node.js 当发送大量请求时,Nodejs请求ETIMEDOUT
我每50毫秒发送一个请求(每秒20个请求),以获取站点主体,但在执行20-30秒后,我在每个请求中都会得到错误提示。我已经设置了Node.js 当发送大量请求时,Nodejs请求ETIMEDOUT,node.js,request,Node.js,Request,我每50毫秒发送一个请求(每秒20个请求),以获取站点主体,但在执行20-30秒后,我在每个请求中都会得到错误提示。我已经设置了process.env.UV\u THREADPOOL\u SIZE=128 我已尝试将THREADPOOL_SIZE设置为大于128的值 for(let i in urls) { setTimeout(function() { getBody(i); //It is function with a request
process.env.UV\u THREADPOOL\u SIZE=128代码>
我已尝试将THREADPOOL_SIZE设置为大于128的值
for(let i in urls) {
setTimeout(function() {
getBody(i); //It is function with a request
},50*i);
}
包:请求
请帮帮我,我想在一秒钟内发送大量请求。UV\u线程池的大小是128,所以你不能增加它通过这个数字
其默认大小为4,但可以在启动时通过
将UV_THREADPOOL_SIZE环境变量设置为任意值(
绝对最大值为128)
其次,请求
模块中没有超时
属性,正确的属性名称是:超时
如果在同一台服务器上并行运行多个请求,则将其设置为3000可能太低,特别是当服务器无法处理那么多请求时
这可能是您收到如此多超时错误的原因之一。所以首先增加这个数字,看看你是否仍然超时
其次,有两种不同类型的超时:
有两种主要类型的超时:连接超时和读取超时
暂停。如果在连接过程中遇到超时,则会发生连接超时
客户端正在尝试建立到远程计算机的连接
(对应于套接字上的connect()调用)。读取超时
在服务器速度太慢无法发回部分数据时发生
答复
执行以下操作可以检查超时是否为连接超时:
if(err.connect === true) // connection timeout.
此外,如果您正在访问同一个域,为了提高速度并减少超时次数,您可以解析IP地址,并直接使用IP访问服务器
我没有测试脚本,但它是为了向您展示如何操作,可能需要进行一些小的修改
您还应该限制请求,因为您可能正在淹没自己的网络。如果在VPS上尝试此操作,可能会比在本地计算机上运行脚本获得更少的超时
例如,在AWS上,有一些网络优化实例更适合发出大量请求,使用其中一个实例将允许您发出比在本地计算机上更成功的请求
因此,这要么是您自己的网络的限制,要么是您向其发出请求的服务器的限制,在这两种情况下,您都需要对请求进行限制以避免错误。您可能会使服务器过载,或者由于请求过多而受到限制。ShowgetBody
,我们需要了解您是如何发出请求的,哪个模块,您传递的参数是什么,请求的超时设置是什么。您可能会出现该错误的原因有多种。还显示堆栈跟踪,因为它可能是连接超时,也可能是读取超时。我已上载代码。不,我刚刚将库更改为axios,此库中不会出现此问题。
if(err.connect === true) // connection timeout.
const dns = require('dns');
const { promisify } = require('util');
const URL = require('url');
const dnsResolve = promisify(dns.resolve);
const ipCache = {};
async getIP(host) {
// Use LRU cache with expiration...
if(ipCache[host]) // If it's set, it's either the resolved IP or dnsResolve Promise
return ipCache[host];
ipCache[host] = dnsResolve(host);
const [ip] = await ipCache[host]; // Wait until the promise is resolved
ipCache[host] = ip;
return ip;
}
async getBody(url) {
const { host } = new URL(url);
const ip = await getIP(host);
// Build the URL using the IP address instead of the domain
request( /* ... */)
}