Javascript 如何优化NodeJS/Express上的内存/cpu?

Javascript 如何优化NodeJS/Express上的内存/cpu?,javascript,node.js,express,web-scraping,vps,Javascript,Node.js,Express,Web Scraping,Vps,我有一个基于Express的节点应用程序,它使用web刮板加载和解析数据 我已经读了很多关于NodeJS的可伸缩性和能够处理一堆并发连接的文章,但是当你运行一个web scraper(发送1000多个并发请求)时,我觉得事情开始有点崩溃了 运行时,我的服务器对其他API请求没有响应,同时运行多个实例会导致速度减慢到蜗牛般的速度 我找不到任何关于限制是什么、限制应该是什么、我应该将多少请求汇集在一起等等的文档 我是否应该将刮板的请求限制为每秒10次?每秒100?每秒1000?或者我可能正在增加分配

我有一个基于Express的节点应用程序,它使用web刮板加载和解析数据

我已经读了很多关于NodeJS的可伸缩性和能够处理一堆并发连接的文章,但是当你运行一个web scraper(发送1000多个并发请求)时,我觉得事情开始有点崩溃了

运行时,我的服务器对其他API请求没有响应,同时运行多个实例会导致速度减慢到蜗牛般的速度

我找不到任何关于限制是什么、限制应该是什么、我应该将多少请求汇集在一起等等的文档

我是否应该将刮板的请求限制为每秒10次?每秒100?每秒1000?或者我可能正在增加分配给VPS上节点进程的CPU/内存量

编辑:对于那些因为这个问题过于基于观点而投票结束的人,下面是我要问的具体问题:

  • 一个Express应用程序在开始达到性能之前可以同时执行多少HTTP请求
  • 增加应用程序可用的内存/cpu是否有任何帮助

  • 有很多不同的方法来评估节点的性能。节点是,尽管它运行的V8引擎继续改进

    让节点执行的一个重要方面是以支持其“非阻塞”执行模型的方式进行编码。这意味着对控制流使用回调函数和/或承诺,而不是传统的同步方法。如果不编写异步代码,节点将阻塞,因为事件循环将挂起需要任何非平凡时间才能完成的代码

    I/O可以(也应该)与节点异步,但CPU繁忙的活动(如刮取后的parsing.xml)不能(或者程度不同),因此事件循环将在每个长CPU任务上挂起

    为了将此应用于您的特定用例并解决性能问题,如果您发布了一些scraper的请求代码,可能会有所帮助

    注意:如果您已经理解了这些概念,并且这低于您的技能水平,我提前表示歉意

    我包含了一段代码,用于启动对一系列.xml资源的一系列请求,并将响应打印到控制台。如果运行这段代码,您会注意到打印常常会“无序”,因为每个请求可能需要不同的时间。为
    http.request()
    方法提供回调而不是使用同步版本的优点是,一旦请求启动,应用程序就可以继续运行并接受新请求。该工作可以随着节点事件循环的每次完成而增量完成

    通过使用专门处理请求的库,可以大大简化此代码段。一个众所周知的方法叫做(恰当地命名),它可以帮助您的代码更加简洁

    另外,在项目中大量使用
    console.log()
    可能会导致性能问题

    var http = require('http');
    
    function getData(index) {
      var options = {
        'hostname' : 'example.com',
        'path' : '/data' + index + '.xml',
        'method' : 'GET'
      };    
      var req = http.request(options, function(response) {
         var fullText = "";
         // listen for incoming data and add it to existing data
         response.on('data', function(more) {
             fullText += more;
         });
         // when request is complete, print it
         response.on('end', function(done) {
             console.log(fullText);
         });
      });
      req.end();
      // Do not fail silently, show error details
      req.on('error', function(e) {
         console.error(e);
      });
    }
    
    for(var i = 0; i < 1000; ++i) {
        getData(i);
    }
    
    var http=require('http');
    函数getData(索引){
    变量选项={
    “主机名”:“example.com”,
    'path':'/data'+index+'.xml',
    'method':'GET'
    };    
    var req=http.request(选项、函数(响应){
    var全文=”;
    //侦听传入数据并将其添加到现有数据
    响应.on('data',函数(更多){
    全文+=更多;
    });
    //当请求完成时,打印它
    响应。on('end',函数(完成){
    console.log(全文);
    });
    });
    请求结束();
    //不要静默失败,显示错误详细信息
    请求开启('错误',功能(e){
    控制台错误(e);
    });
    }
    对于(变量i=0;i<1000;++i){
    获取数据(一);
    }
    
    当我们说NodeJ可以处理1000多个并发请求时,它们本质上是非阻塞请求,即不是CPU密集型任务。如果web scraper是非常CPU密集型的任务,那么最好使用节点服务器集群,并在这些服务器上安装负载平衡器。@AmanGupta真棒,这些术语我以前从未听说过。你能推荐一些资源来学习更多关于负载平衡和集群工作的知识吗?你可以从这开始:这是一个很棒的伙伴,不需要道歉,因为这正是我所希望的。虽然我越来越了解节点中的阻塞/非阻塞代码,但很难找到这些概念的简单解释。肯定也不知道关于
    console.log()
    !最后一个问题,如果我为
    请求
    实现了一个排队系统,关于我应该批处理多少请求以及发送它们的频率有什么建议吗?很好地解释了在使用池模式时请求模块实际上是如何为您排队的。