改进http请求响应时间



我创建了一个nodejs脚本,每50ms发出一次HTTP请求,但随着请求数量的增长,接收响应的时间太长。如何提高响应时间?

function makeRequest() {
superagent
.post('http://example.com')
.send({"test": "test"})
.set('Connection', 'keep-alive')
.then(console.log, console.log);
}
setInterval(() => makeRequest(), 50);

这是一个麻烦的代码。如果你的http请求需要超过50ms才能完成,那么运行中的活动请求数量会越来越大,直到最终,你会消耗太多的系统资源(套接字、内存等(。事情可能会越来越慢,或者你可能会耗尽一些资源,并开始出现错误或崩溃。

此外,您不希望同时有数千个请求到达目标服务器,因为在这种类型的负载下,它可能会减慢速度。这种类型的问题也可能导致雪崩式故障,响应的轻微延迟会导致请求的突然增加,从而减慢目标服务器的速度,从而导致更多的请求增加,从而迅速失控,导致一些东西死亡。重要的是要始终对这些类型的东西进行编码,以避免任何形式的雪崩故障。

我的建议是,在前一个请求完成后的某个固定毫秒内发出一个新请求(因此在飞行中一次只有一个请求(。或者,一个更复杂的版本会在前一个开始50毫秒后发出新请求,但不会在前一次完成之前发出。这样,一次只会有一个请求在运行,它们永远不会积累,资源使用率应该保持相当恒定,而不是随着时间的推移而积累,即使目标服务器由于某种原因变得缓慢。

以下是在完成上一个请求后进行下一个请求的方法,并且不超过每50ms一次:

function makeRequest() {
return superagent
.post('http://example.com')
.send({ "test": "test" })
.set('Connection', 'keep-alive');
}
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
function run() {
const repeatTime = 50;
const startTime = Date.now();
return makeRequest().catch(err => {
console.log(err);
// decide here if you want to keep going or not
// if so, then just return
// if not, then throw
}).then(result => {
console.log(result);
let delta = Date.now() - startTime;
if (delta < repeatTime) {
// wait until at least repeatTime has passed before starting next request
return delay(repeatTime - delta).then(run);
} else {
return run();
}
}).catch(() => {
// aborted because of error
});
}
run();

最新更新