高并发下,NodeJs中使用fetch拉取资源时频繁超时

问题描述 投票:0回答:1

现在我写了一个如下的程序:

// NodeJs version: v20.16.0

async function fetchFile(url: string, timeout: number): Promise<Response> {
    const controller = new AbortController()
    const id = setTimeout(() => controller.abort('timeout: ' + url), timeout)
    return fetch(url, {signal: controller.signal})
        .finally(() => clearTimeout(id))
}

const testUrl = 'https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.15.2/contrib/copy-tex.min.js'
const count = 100
const timeout = 5000

async function test() {
    for (let i = 0; i < count; i++) {
        try {
            await Promise.all(
                new Array(count).fill(testUrl).map(it => fetchFile(it, timeout))
            )
            console.log('success: ' + i)
        } catch (e: any) {
            console.error(`error[${i}]: ${e}`)
        }
    }
}

test()

当我运行这段代码时,经常会出现访问超时的问题,如下图所示。

控制台输出

超时的概率随着并发数的增加而增加,我在使用时也遇到了类似的问题

node-fetch

在这段代码中,相同的资源被重复访问。在我的实际项目中,我是同时访问不同的资源,但为了测试方便,我在这里这样写。实际测试中,超时的资源似乎是固定的;总是有一些特定的链接超时。然而,当我单独测试这些链接时,它们都在 200 毫秒内成功获取(我将超时设置为 5 秒)。仅当同时获取多个链接时才会出现超时问题。

我想知道是什么原因导致这个问题,是否有办法保证不会因为高并发而超时,同时最大化并发水平。

node.js concurrency fetch timeout
1个回答
0
投票

我在使用我们的文档管理系统并通过我们的下载器实用程序获取文件时遇到了类似的问题。 您可以尝试以下解决方案:

1.限制并发请求数。

2.对失败的请求实施重试和指数退避。

3.考虑使用不同的库或工具来更有效地处理并发。

4.监控和调整超时设置并注意服务器限制。

npm p-limit 库允许您创建承诺的并发限制。当您需要限制并发异步操作的数量时,它很有用。

如果您觉得这个答案有帮助,请点赞!

© www.soinside.com 2019 - 2024. All rights reserved.