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 でも実行されます。これは 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. 
}); 

誰でもこれについてのアイデアを持っていますか?すべての助けに感謝します。

クリスピン

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

すべてが意図したとおりに機能しますが、完璧なソリューションではない可能性があります。ただし、これにより、バックグラウンド ジョブ プロセスとアプリ プロセス間でメッセージを簡単に送信し、これら 2 つの間でデータを保存する必要がないことが明らかになります。これが将来誰かを助けることを願っています。

さよなら。

于 2013-10-26T20:24:19.543 に答える