由于多个请求,对Node.js服务器的请求超时

时间:2020-03-06 20:59:28

标签: javascript node.js server

所以我对Node并不是很有经验,所以请多多包涵。

我在node.js服务器上有2条路由。在典型的一天中,两条路线都会同时被请求打中。路线1会平稳运行,但是路线2是一个长期运行的过程,它会返回多个承诺,因此路线1将占用资源,导致路线2暂停(我已通过数据日志确定发生了这种情况)。

路线1如下:

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

路线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();
  }
}

所以我猜测问题是异步/等待在继续处理记录之前正在等待资源变为可用。
我有办法将其写到route1不会干扰route2的地方吗?

2 个答案:

答案 0 :(得分:1)

在Node中,几乎您可以await(或调用then)使用的所有内容都是异步的。它不会阻塞执行线程,而是将任务转移到您不控制的另一层,然后等待其完成,同时可以自由地处理其他任务。这包括处理文件系统和网络请求。有一些方法可以仍然阻塞线程,例如,使用文件系统方法的同步版本(如readFileSync而不是readFile)或在javascript上进行大量计算(如计算4569485960485096的阶乘)

鉴于您的route1不执行任何此操作,因此它不会从route2中获取任何资源。它们并行运行。很难看到没有实际的代码,但是我很确定您连接超时,因为您的route2编写得很差,并且由于与Node无关的原因需要花费很长的时间来解析(或根本无法解析)。性能或阻塞。在等待您的文件系统在每个数组项(或其中发生的任何事情)中运行6次无休止的测试时,Node只是令人不寒而栗,在这种情况下,浏览器停止等待响应并向您显示连接超时。您很有可能不需要等待数据中每个数组的每个测试,而不必只是并行运行所有

在此处详细了解https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ 还有https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

答案 1 :(得分:0)

NodeJ是单线程的。这就是为什么将cpu /资源密集型服务分解为微服务的原因。

如果这些route1和route2需要位于同一服务器中,则请查看是否可以更改算法或处理计算的方式以优化性能或破坏它们,以便它们由多核体系结构中的不同内核处理。

同样,如果您要讨论具有庞大用户群的生产情况,那么将它们组合在一起并在同一服务器上运行并不是绝对好的主意。

See this for more information

相关问题