2015-08-08 2 views
11

Я создаю приложение-узел, которое будет действовать как «рабочий», чтобы выложить новое приложение, а затем загрузить приложение в AWS. Есть пять задач, которые завершают цикл эшафота.Задачи очереди в узле

Я хотел бы знать, возможно ли в Node/Express отправлять очереди входящих запросов, а затем запускать цикл эшафота для запросов в очереди, когда цикл успешно завершен. Одновременно должен выполняться только один цикл эшафота.

+0

Является ли это приложение «кластером» или одним процессом? Вы предпочли бы ответ, используя стиль «async» или обещания? –

+0

@AaronDufour Я бы предпочел, чтобы он запускался как один процесс. – leaksterrr

ответ

6

Да, вы можете это сделать. Возможно, ваш текущий код выглядит примерно так (я предполагаю, что вы используете обещания):

app.get('/', function (req, res) { 
    scaffold().then(function() { 
    res.send('done'); 
    }); 
}); 

Мы будем использовать promise-queue упростить вещи. Сначала нам нужно создать очередь:

var queue = new Queue(1); 

Аргумент - количество элементов, которые очередь будет запускаться одновременно. Поскольку вы не хотите параллелизма, мы используем 1. Теперь мы должны перейти в обещании завода вместо выполнения обещания:

app.get('/', function (req, res) { 
    queue.add(function() { 
    return scaffold().then(function() { 
     res.send('done'); 
    }); 
    }); 
}); 

Если мы только что прошли в обещании, это будет начать немедленно. Вот почему мы должны передать функцию, которая возвращает обещание.

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

app.get('/', function (req, res) { 
    queue.add(scaffold); 
    res.send('done'); 
}); 
+1

Мое приложение не использует обещания, я буду реорганизовать использовать обещания и вернуться к вам. – leaksterrr

+0

@leaksterrr Я был бы рад дать вам несколько указателей, ориентированных на код без обещаний, если вы покажете код для работы. –

-2

Попробуйте использовать вилку на входящей события:

http://nodejs.org/api/child_process.html

На каждого ребенка получить один за другим все элементы, необходимые brefore обработки леса и загрузку в AWS.

+0

Большинство людей используют Nginx, чтобы уйти от парадигмы нереста новых процессов, чтобы взять на себя рабочую нагрузку. Более того, если это не регулируется, это может стать отправной точкой для серьезных DoS-атак. – tsturzl

2

Это не «строго node.js» ответ, но я настоятельно рекомендую смотреть в Beanstalkd как способ решения этой проблемы (с использованием fivebeans как nodejs библиотеки).

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

+0

Если вам интересно, у меня есть несколько слайдов о системе, использующей beanstalkd по адресу http://slides.com/michaelholroyd/asyncnodejs#/4 – Meekohi