如何在nodejs中管理队列?

时间:2017-01-02 09:28:34

标签: node.js memory queue kue job-queue

我在Nodejs中编写了一个脚本截取网站的截图(使用slimerJs),这个脚本需要大约10-20秒才能完成,这里的问题是服务器停止运行,直到这个脚本完成

app.get('/screenshot', function (req, res, next) {
  var url = req.query.url;
  assert(url, "query param 'url' needed");
  // actual saving happens here
  var fileName = URL.parse(url).hostname + '_' + Date.now() + '.png';
  var command = 'xvfb-run -a -n 5 node slimerScript.js '+ url + ' '+ fileName;
  exec(command, function (err, stdout, stderror) {
    if(err){ return next(err); }
    if(stderror && (stderror.indexOf('error')!= -1) ){ return next(new Error('Error occurred!')); }
    return res.send({
      status: true,
      data: {
        fileName: fileName,
        url: "http://"+path.join(req.headers.host,'screenshots', fileName)
      }
    });
  })
});

由于脚本在内存中生成firefox浏览器并加载网站,因此ram的使用量可能高达600-700mb,因此我无法异步执行此命令,因为ram在服务器上很昂贵。

我可以知道是否可以对传入的请求进行排队并以FIFO方式执行它们?

我尝试检查像kue,bull和bee-queues这样的软件包,但我认为这些都假设在队列启动之前已经知道了作业列表,因为我的作业列表取决于使用该站点的用户,我也想告诉别人他们在队列中,需要等待轮到他们。这可以用上面提到的包裹吗?

1 个答案:

答案 0 :(得分:0)

如果我做了类似的事情,我会尝试这些步骤。

1.存储请求信息的数组(队列),当任何请求到来时,将这些信息存储在数组中,并将msg发回给用户,告诉他们他们在队列中,或者服务器正忙已经有太多请求了。

2.进行屏幕截图作业,异步,但不能同时进行。如果在新请求到来时发现队列为空,则可以启动该作业,并在完成最后一个请求时以递归方式启动另一个队列。

function doSceenShot(){
  if(a.length > 1){
    execTheJob((a[0])=>{
      //after finishing the job;
      doScreenShot()
    })
  }
}

3.通过投票或其他方式通知您已完成工作的用户。