由于多次请求,向Node.js服务器发送请求超时

3

我不是很熟悉Node,敬请谅解。

我有一个Node.js服务器上的两个路由。 在典型的一天中,两个路由将同时接收请求。 路由1将顺利运行,但路由2是一个长时间运行的进程,返回多个承诺,因此路由1将占用资源,导致路由2暂停(通过数据日志已确定发生了这种情况)。

路由1如下:

  app.post('/route1', function (req, res) {
    doStuff().then(function(data){
      res.end();
    })
  }

Route 2正在处理一个数组的数据,需要逐个解析数组中的1条记录

app.post('/route2', function (req, res){
 async function processArray(array) {
      for (const item of array) { 
         await file.test1()(item, res);
           await file.test2()(item, res);
             //await test3,test4,test5,test6 
      }
  }
  processArray(data).then(function() {
    res.end();
  }
}

我猜问题在于async/await正在等待资源变得可用后才会继续处理记录。
有没有办法让我编写的代码,使得route1不会干扰route2?

2个回答

1
在Node中,几乎所有可以使用await(或调用then)的内容都是异步的。它不会阻塞执行线程,而是将任务卸载到另一个你无法控制的层面,然后等待其完成,同时可以自由地处理其他事情。这包括与文件系统和网络请求的工作。仍然有一些方法可以阻止线程,例如使用文件系统方法的同步版本(如readFileSync而不是readFile)或在javascript上进行重计算(如计算4569485960485096的阶乘)。
假设您的route1没有做任何这样的事情,它不会从route2中获取任何资源。它们同时运行。如果没有看到实际代码,很难判断,但我非常确定你遇到连接超时是因为你的route2编写得不好,需要很长时间才能解析(或根本无法解析),原因与Node性能或阻塞无关。Node只是在等待你的文件系统运行这些无尽的测试6次,并且在发生此情况时,浏览器停止等待响应并显示连接超时。最有可能的是,您不需要在数据的每个数组项上等待每个测试,而只需并行运行它们所有。

在这里阅读更多 https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/,以及https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all


0

NodeJs是单线程的。这就是为什么你要将CPU/资源密集型服务拆分成微服务的原因。

如果这些route1和route2需要在同一台服务器上,则请尝试更改算法或处理计算的方式以优化性能,或者将它们分解为由多核架构中的不同核心处理。

同样,如果您正在谈论具有庞大用户群的生产情况,则将它们放在一起并在同一台服务器上运行绝对不是一个好主意。

请参阅此处以获取更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接