Как управлять очередью в nodejs?

Я написал скрипт в 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 в памяти и загружает веб-сайт, использование оперативной памяти может достигать 600-700 МБ, и поэтому я не могу выполнять эту команду асинхронно, поскольку оперативная память на серверах дорогая.

могу ли я узнать, возможно ли ставить в очередь входящие запросы и выполнять их в порядке FIFO?

я пробовал проверять такие пакеты, как kue, bull и bee-queues, но я думаю, что все они предполагают, что список заданий уже известен до запуска очереди, где мой список заданий зависит от пользователей, использующих сайт, и я также хочу сообщить людям, что они стоят в очереди и должны ждать своей очереди. это возможно с вышеупомянутыми пакетами?


person Syed Faizan    schedule 02.01.2017    source источник


Ответы (1)


Если бы я делал то же самое, я бы попробовал эти шаги.

1. Массив (очередь) для хранения запрошенной информации, когда приходит какой-либо запрос, сохраняет эту информацию в массиве и отправляет сообщение пользователям, сообщая им, что они находятся в очереди, или сервер занят, если уже есть слишком много запросов.

2. Выполнение снимка экрана асинхронно, но не все в одно и то же время. Вы можете запустить задание, если обнаружите, что очередь пуста, когда приходит новый запрос, и запустить другое рекурсивно, когда закончите последний.

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

3. Сообщите пользователю о завершении задания с помощью опроса или другими способами.

person YLS    schedule 02.01.2017
comment
я использовал kue и societ.io, чтобы решить эту проблему, спасибо за помощь - person Syed Faizan; 01.02.2017