2015-02-24 73 views
2

我想看到發生的事情是讓MEAN旋轉了所有四個集羣。然後運行計劃的工作,每天20:30以電子郵件向我的客戶發送電子郵件。目前運行的次數不止一次。 我該如何做到這一點?MEANIO 4個羣集只能運行一次計劃的Job?

'use strict'; 
var mean = require('meanio'); 
var cluster = require('cluster'); 
var schedule = require('node-schedule'); 

var z = schedule.scheduleJob('30 20 * * *', function() { 
    console.log('test the scheduler') 
}); 
if (cluster.isMaster) { 


// Count the machine's CPUs 
var cpuCount = require('os').cpus().length; 

// Create a worker for each CPU 
for (var i = 0; i < cpuCount; i += 1) { 
    console.log ('forking ',i); 
    cluster.fork(); 
} 

// Listen for dying workers 
cluster.on('exit', function (worker) { 
    // Replace the dead worker, we're not sentimental 
    console.log('Worker ' + worker.id + ' died :('); 
    cluster.fork(); 

}); 


} else { 

var workerId = 0; 
if (!cluster.isMaster) 
{ 
    workerId = cluster.worker.id; 
} 


    mean.serve({ workerid: workerId /* more options placeholder*/ }, function (app, config) { 
     var port = config.https && config.https.port ? config.https.port : config.http.port; 
     console.log('Mean app started on port ' + port + ' (' + process.env.NODE_ENV + ') cluster.worker.id:', workerId); 
    }); 
} 

輸出

forking 0 
forking 1 
forking 2 
forking 3 
Mean app started on port 3000 (development) cluster.worker.id: 1 
Mean app started on port 3000 (development) cluster.worker.id: 2 
Mean app started on port 3000 (development) cluster.worker.id: 3 
Mean app started on port 3000 (development) cluster.worker.id: 4 
test the scheduler 
test the scheduler 
test the scheduler 
test the scheduler 
test the scheduler 

回答

1

爲了澄清,你問爲什麼你的調度程序運行一次以上?如果是這樣,這是因爲cluster.fork()的工作方式與unix fork十分相似,因爲它創建了另一個基本上是當前副本的進程。每個流程都會在自己的參考框架中安排工作,並且每個流程都將執行該工作。您可能希望確保只通過在if(cluster.isMaster) {內移動調度來安排主進程中的作業。

通過這樣做,您可以指示主人派遣工作給工人。不過,您必須自己添加負載平衡。

0

您可能會考慮使用作業隊列來處理此問題,而不是直接將郵件放置在隊列中,並從此處開始處理。 在addtoQueue之前,看看現有任務是否已經存在,從而避免多個實例。 我已使用Kue並聽說過好東西busmq