JVG*_*JVG -1 javascript vps node.js web-scraping express
我有一个基于Express的Node应用程序,它使用Web scraper加载和解析数据.
我已经阅读了很多关于NodeJS的可扩展性以及能够处理一堆并发连接的内容,但是当你运行一个web scraper(发送1000多个并发请求)时,我觉得事情开始崩溃了一点.
运行时,我的服务器对其他API请求没有响应,并且一次运行多个实例会导致速度降低到蜗牛的速度.
我找不到任何关于限制是什么,它们应该是什么,我应该聚集在一起的请求数等等的文档.
我应该将刮刀的要求限制为每秒10次吗?每秒100?每秒1000?或者我可能会增加在我的VPS上分配给我的节点进程的CPU /内存量?
编辑:对于那些投票结束的人,因为这个问题太基于意见,这具体是我要问的:
小智 5
评估Node的性能有很多种不同的方法.通常建议将节点用于I/O绑定工作负载而不是CPU绑定工作负载,尽管它运行的V8引擎仍在不断改进.
让Node执行的一个重要方面是以一种启用其"非阻塞"执行模型的方式进行编码.这意味着使用回调函数和/或控制流的承诺,而不是传统的同步方法.如果您不编写异步代码,Node 将阻止,因为事件循环将挂起需要任何非常重要的时间来完成的代码.
I/O可以(并且应该)与Node异步,但是CPU占用大量的活动(比如在刮掉它之后解析.xml)不能(或者不同程度),所以事件循环最终会挂起长CPU任务.
要将此应用于您的特定用例并解决性能问题,如果您发布了一些刮刀的请求代码可能会有所帮助.
注意:如果您已经理解了这些概念并且低于您的技能水平,我会提前道歉.
我已经包含了一段代码,它启动了一系列.xml资源的一系列请求,并将响应打印到控制台.如果您运行此代码,您会注意到打印通常会"乱序",因为每个请求可能会花费不同的时间.为http.request()方法提供回调而不是使用同步版本的优点是,一旦请求启动,您的应用程序就可以继续运行并接受新请求.每次完成Node事件循环时,都可以逐步完成工作.
通过使用专门处理请求的库,可以大大简化此代码段.众所周知的一个称为请求(恰当地命名),它可以帮助您的代码更简洁.
另外,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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1073 次 |
| 最近记录: |