具有Express.js和Kue.js的集群

时间:2013-10-23 13:31:14

标签: javascript node.js express kue

我目前正在为自己制作一个需要在后台处理内容的项目,但是,我需要在Express和Kue之间进行通信。 但有关当前设置的更多信息: 我的Express.js在主机内部占用了超过一半的CPU。这按预期工作。现在我运行另一个运行kue.js进行后台处理的节点进程。由于kue通过redis安排其工作,我现在的主要问题是如何将处理后的后台作业中的数据发送回我的主node.js应用程序。

我的设置简述:

app.js(使用节点app.js运行)

var cluster = require('cluster'), Datasets = require('./models/datasets'), kue = require('kue'), jobs = cue.createQueue();
if(cluster.isMaster) {
  // Forking going on here    
} else {
  // Express.js app runs here
  app.get('/', function(req, res) {
    // Now here is where i schedule the job and i would like to retrieve an answer from the job when its done, like with on('complete', ...) but that doesn't work at all
    jobs.create('stuff', {lorem: 'ipsum', dolor: ''}).save();
  });
}

background.js(也与节点background.js一起运行,这不是像app那样的节点进程)

// omiting libraries right now, its simply kue and datasets like in app.'s
jobs.process('stuff', function(job, done){
  //processing some background stuff here
  // Now here i would like to pass back an array of objects to the app.js process after the job is completed. 
}); 

有人对此有所了解吗?感谢每一位帮助。

诚恳, 克里斯平

1 个答案:

答案 0 :(得分:2)

嗯,经过几个小时的工作和测试后,我自己解决了这个问题。这是我提出的解决方案:

app.js - 像往常一样分叉群集。但是,在群集的子进程中,运行background.js的子进程

// FOrking and stuff
} else {
  var background = child_process.fork(__dirname + '/background.js');
  app.get('/', function(req, res) {
    var job = {//job stuff here, like type of job and data and stuff};
    background.send(job);
  });

background.js - 作为集群工作程序的子进程运行

// Pretty much the same like before, but now queueing jobs and processing them too
process.on('message', function(object) {
  jobs.create(//accessing your job data here like type of job priority and data);
});

一切都按预期工作,但可能不是完美的解决方案。但是,这清楚地表明了如何在后台作业进程和应用程序进程之间轻松发送消息,而无需在这两者之间存储数据。希望这将有助于将来的某些人。

这么久。