Перейти к содержимому

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.

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

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

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

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

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

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

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 28 other followers

%d bloggers like this: