Skip to content

Kue — очереди с приоритетами на основе Redis

05/07/2011

Если в Вашем проекте необходимо выполнять какие то задачи в фоновом режиме, будь то отправка почты или перекодирование видео, Вам следует присмотреться к Kue — инструменту для управления очередями задач с поддержкой приоритетов, метаданных и удобным веб-интерфейсом.

Установка

Для работы Kue требуется Redis версии не меньше чем 2 (с поддержкой команды WATCH). Я использовал 2.2.11, последнюю стабильную версию. Об установке и настройке Redis можно подробнее прочитать в другой статье.

Сам Kue ставится из npm:

npm install kue

Ничего настраивать после установки не нужно — Kue сам подключится к Redis по стандартному порту. Если Redis у Вас настроен на нестандартный порт, нужные параметры можно передать при подключении модуля в коде.

Использование

Попробуем сразу создать задачу:

var kue = require('kue'),
    jobs = kue.createQueue();

jobs.create('email', {
    title: 'welcome email for tj'
  , to: 'tj@learnboost.com'
  , template: 'welcome-email'
}).save();

Здесь "email" это тип задачи, объект содержит метаданные, которые будут доступны при выполнении. Свойство title особое: оно будет использоваться в веб-интерфейсе как имя задачи. Если требуется указать приоритет задачи, перед save() в цепочку идёт .priority() с указанием приоритета.

Приоритет может быть задан либо числом (чем меньше, тем раньше задача попадёт в очередь), либо строкой. Строки служат указателями наиболее типичных приоритетов:

  • low: 10
  • normal: 0
  • medium: -5
  • high: -10
  • critical: -15

Получить задачу для выполнения можно с помощью jobs.process:

jobs.process('email', function(job, done) {
  console.log('Processing "' + job.data.title + '"');
  done();
});

При выполнении в обработчик передаётся объект задачи job (метаданные доступны в свойстве data) и callback done — если он будет вызван без передачи ошибки, задача будет отмечена как успешно выполненная.

Маленькие задачи, которые нет смысла выполнять поодиночке, можно обрабатывать по несколько штук параллельно. Для этого после типа задачи надо передать количество задач для одновременного выполнения. Например, чтобы отправить сразу 20 писем, можно использовать такой код:

jobs.process('email', 20, function(job, done) {
  console.log('Processing "' + job.data.title + '"');
  done();
});

Если надо следить за выполнением отдельных задач, можно использовать индикаторы выполнения и индивидуальные логи. Чтобы отметить степень выполнения долгой задачи, используйте job.progress:

job.progress(done, total);

Здесь total это общее количество шагов выполнения (или элементов для обработки), done — количество уже выполненных шагов. Если при выполнении что то пойдет не так, можно записать сообщение в лог задачи:

job.log('Error rendering slide %d: %s, slide.id, render.err);

Веб-интерфейс

У Kue есть веб-интерфейс, представляющий собой приложение на основе Express. Чтобы его запустить надо вызвать kue.app.listen и передать ему порт:

kue.app.listen(3003);

В веб-интерфейсе можно следить за выполнением задач.

Также можно просматривать метаданные и индивидуальные логи задач.


Kue показывает индикаторы степени выполнения той или иной задачи, задаваемые job.progress.

Ссылки по теме

Advertisements
3 комментария
  1. спасибо большое за описание. Только вот сегодня случайно зашёл на github посмотреть репы learner boost’a.

  2. Хорошая статья, спасибо.
    Сам недавно занимался очередями, но свой выбор остановил на Starling. Подкупил протокол Memcache и как следствие этого наличие готовых клиентов почти для любого языка.

  3. Вещь хорошая, и главное с приятным и удобным интерфейсом. А то Gearman под PHP меня изрядно замучил.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: