1

我目前正在为自己开发一个需要在后台处理内容的项目,但是,我需要在 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 一起运行,这与应用程序不同的节点进程)

// 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. 
}); 

有人对此有想法吗?感谢您的每一次帮助。

真诚的,克里斯平

4

1 回答 1

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);
});

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

太长。

于 2013-10-26T20:24:19.543 回答