【问题标题】:Nodejs parallel requests are getting slowerNodejs 并行请求越来越慢
【发布时间】:2021-12-11 23:04:42
【问题描述】:

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

设置:
本地响应服务器始终提供相同的 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、请求)都会发生这种情况。

提前感谢您,祝您有愉快的一天

【问题讨论】:

    标签: node.js performance concurrency parallel-processing request


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我了解并行发送的请求越多,服务器处理它们所需的时间就越长。但这不应该只是增加一个请求需要完成的总时间吗?就像 5 个并行请求一样,每个请求需要 50 毫秒才能完成,而 10 个并行请求可能每个请求需要 70 毫秒。 Tbh 我不明白为什么它们会依次变慢,它们不应该像每个 X ms 之后那样同时完成吗?
    • 不。您的操作按 FIFO 顺序添加到队列中,因此假设您的端点对数据库进行了一些调用,这需要一些网络作业,这件事是异步发生的,因此作为任务添加到队列中的某个位置。所以最先加入队列的任务会被优先处理,先进先出。
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2020-01-23
    • 2023-03-12
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多