Node Clusterを使用します。クラスタを使用すると、マスターは複数のワーカーを作成することができます。これは、あなたのクローンが着信要求をブロックしないことを意味します。ちょうど1人の労働者がCronをやっていることを確認してください。
以前はnode-cronで作業していませんが、SyncedCronの経験があります。しかし同じでなければならない。
httpクライアントには、これを行うライブラリがたくさんあります。Requestまたはhttpclientを確認できます。
あなたのコードは次のようになります。
var cluster = require('cluster');
var http = require('http');
var numWorkers = require('os').cpus().length-1; // just give 1 cpu for OS to use, or maybe 2
if (cluster.isMaster) {
console.log('Master cluster setting up ' + numWorkers + ' workers...');
var cronPID=null;
for(var i = 0; i < numWorkers; i++) {
var worker=cluster.fork();
if(i==0){
//instructing the first worker to assume role of SyncedCron.
worker.send('you do it!');
cronPID=worker.process.pid;
console.log("worker "+cronPID+" choosed as Cron worker!");
}
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function(worker, code, signal) {
// have to revive the worker
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
var newWorker=cluster.fork();
if(cronPID==worker.process.pid)
{ // need to re-elect a new cron worker!
newWorker.send('you do it!');
cronPID=newWorker.process.pid;
console.log("worker "+cronPID+" choosed as Cron worker!");
}
});
}else
{ // worker sides
process.on('message', (msg) => {
// validate your message that you get
// if validated, create a cron job here
});
// create your express below, I assume you use express instead of node's http library
var express = require('express');
var app = express();
app.post...........
}
注:
- は、少なくとも、複数のコアを持つ必要があり、マスターを復活させる "forever"
- お使いのサーバーのようなものを使用するには4しかし、私はもっと(8多分?)をお勧めします。
webservice呼び出しがNodeのメインスレッドをブロックすることが懸念されているように聞こえます... http://stackoverflow.com/a/14797359/311181を参照してください。 – chardy
@chardy:完全に真実ではありません。 Node.jsでは、あなたのコードを除いてすべてが並行して実行されます。つまり、Node.jsで書いたすべてのI/Oコードは非ブロックであり、逆にNode.jsで書いた非I/Oコードはすべてブロックしています。 – Rudy
よく私のニーズに合っているので、https://github.com/rschmukler/agendaを使うことに決めました。アジェンダとともに、nodejsのクラスタリングオプション(@Rudyで記述)を使用します。統計統計の生成に関する問題は、それを非ブロックにすることが難しいことです。たとえば、forを使っていくつかのデータを繰り返し処理すると、ブロックされます。 –