【问题标题】:How to manage a queue in nodejs?如何在nodejs中管理队列?
【发布时间】:2017-01-02 09:28:34
【问题描述】:

我在 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 等软件包,但我认为这些都假设工作列表在队列开始之前已经知道,因为我的工作列表取决于使用该网站的用户,我也想告诉人们他们正在排队,需要等待轮到他们。上面提到的软件包可以做到这一点吗?

【问题讨论】:

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


    【解决方案1】:

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

    1.一个数组(一个队列)来存储请求的信息,当任何请求到来时,将这些信息存储在数组中,并向用户发送一条消息,告诉他们他们在队列中,或者服务器忙,如果请求已经太多了。

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

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

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

    【讨论】:

    • 我使用了 kue 和 societ.io 来解决这个问题,感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多