Подтвердить что ты не робот

Задачи очереди в Node

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

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

4b9b3361

Ответ 1

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

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

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

var queue = new Queue(1);

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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