Очередь Redis в кластерной среде Node.js

Используя поддержку кластера Node.js, я хотел бы, чтобы главный процесс создавал элементы данных, которые добавляются в очередь Redis. Затем я хотел бы запустить несколько рабочих процессов, которые читают очередь Redis. Естественно, только один из рабочих процессов должен потреблять элемент данных, извлеченный из очереди.

Для начала, можете ли вы посоветовать, где искать поддержку пакетов Node или необработанные команды Redis для достижения этой цели? Позвольте мне подчеркнуть, что потребители - это отдельные процессы в кластерной среде Node.js, где мы можем настроить количество рабочих процессов, конкурирующих за чтение из одной очереди Redis, чтобы настроить общую производительность системы.


person jfathman    schedule 07.05.2014    source источник


Ответы (1)


Похоже, что kue - это именно то, что нам нужно.

Минимальная тестовая программа постановки задач в очередь через Redis в кластерной среде Node.js:

// cluster-queue.js

var kue     = require('kue');
var cluster = require('cluster');

var numWorkers  = process.argv[2];
var numParallel = process.argv[3];
var jobDelay    = process.argv[4];
var numJobs     = process.argv[5];

if (process.argv.length !== 6) {
  console.log('Usage: node cluster-work-queue <numWorkers> <numParallel> <jobDelay> <numJobs>');
  process.exit(1);
}

var jobs = kue.createQueue();

var jobType = 'someTask';

if (cluster.isMaster) {
  for (var i = 0; i < numWorkers; i++) {
    cluster.fork();
  }
  for (var j = 0; j < numJobs; j++) {
    (function(count) {
      var data = { count: count };
      jobs.create(jobType, data).save(function(err) {
        if (err) {
          console.log('jobs.create', err);
        } else {
          console.log('master', 'jobs.create', count);
        }
      });
    })(j);
  }
} else {
  jobs.process(jobType, numParallel, function(job, done){
    console.log('worker', cluster.worker.id, 'jobs.process', job.data);
    setTimeout(function() { done(); }, jobDelay);
  });
}

Пример выполнения (обратите внимание на параметры командной строки для настройки количества рабочих и т. Д.):

[jfathman@cloud node]$ node cluster-queue.js 2 1 20 10
master jobs.create 0
master jobs.create 1
master jobs.create 2
master jobs.create 3
master jobs.create 4
master jobs.create 5
master jobs.create 6
master jobs.create 7
master jobs.create 8
master jobs.create 9
worker 1 jobs.process { count: 0 }
worker 2 jobs.process { count: 1 }
worker 1 jobs.process { count: 2 }
worker 2 jobs.process { count: 3 }
worker 1 jobs.process { count: 4 }
worker 2 jobs.process { count: 5 }
worker 1 jobs.process { count: 6 }
worker 2 jobs.process { count: 7 }
worker 1 jobs.process { count: 8 }
worker 2 jobs.process { count: 9 }
^C
person jfathman    schedule 09.05.2014