2017-01-02 14 views
0

Я написал сценарий в Nodejs, который снимает скриншот веб-сайтов (используя slimerJs), этот скрипт занимает около 10-20 секунд, проблема в том, что сервер застопорился, пока этот скрипт не завершился.Как управлять очередью в nodejs?

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

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

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

ответ

0

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

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

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

3.Необщите пользователя, с которым вы закончили работу, путем опроса или другими способами.

+0

Я использовал kue и societ.io, чтобы исправить эту проблему, спасибо за помощь –

 Смежные вопросы

  • Нет связанных вопросов^_^