Nodejs 并行请求越来越慢

Nodejs parallel requests are getting slower

我遇到节点问题,对于我添加到并行队列的每个网络请求,我获得网络响应的时间都会增加几毫秒,这正常吗?如果是,请告诉我为什么,他们不应该花同样的时间来回复吗?

设置:
本地响应服务器始终提供相同的 300KB JSON 响应。
查询方式:

const Q = require('q')
let queue = []
for (var i = 100; i > 0; i--) {
    queue.push(getDamageInfo())
}

Q.allSettled(queue)
.then((result) => {})
const Q = require('q')
const request = require('request')

function getDamageInfo() {
    id = '79d568d6-b820-40b4-845a-02228dcde338'
    url = 'http://localhost:3001/damage/'
    let deferred = Q.defer()
    let start = new Date()
    request.get(url + id , {
        'auth': {
            'bearer': token
        }
    }, (err, res, body) => {
        let end = new Date() - start
        console.log('get-damage-info: ' + id + ' %dms', end)
        if(res.statusCode != 200) {
            deferred.reject({statusCode: res.statusCode, error: err })
        } else {
            deferred.resolve(JSON.parse(body))
        }
    })

    return deferred.promise
}

控制台输出:

get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 43ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 44ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 46ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 48ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 51ms
.
.
.
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 223ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 224ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 225ms

我不明白为什么从请求 1 到请求 5 的 5 个并行请求的响应时间已经增加了将近 10 毫秒。所有尝试过的库(https、axios、请求)都会发生这种情况。

提前谢谢你,祝你有愉快的一天

其实也是意料之中的。您会在任何技术上看到相同的结果,这很自然,您发送到服务器的并发请求越多,它最终需要处理它们的时间就越多。

您的测试代码发送 100 个并发请求。

你要明白 Node.js 也是资源有限,最后 libuv 为 Node.js 实现异步的库使用了线程池,而且它有一系列的工作要做。因此,队列中的工作越多,您在完成工作之前需要等待的时间就越多。实际上有多个队列,但这是一个实现细节。

此外,最后,还有一些硬件限制,例如您的 CPU 中有所有 4 个核心,因此所有工作都由您的 CPU 执行。当您的计算机有更多工作要做时,它不会增加核心数量,但会减少整体响应时间。