Nodejs集群仅将任务分配给一个工作者(任何)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs集群仅将任务分配给一个工作者(任何)相关的知识,希望对你有一定的参考价值。

我面临的问题是该项目已经用cluster编程来分配任务。

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('exit', (worker, code, signal) => {
  });
} else {
var server = http.createServer(app);
var usernames = {};
var showusernames = {};
var usersmessages = [];
require('../server/controllers/communication/chat.js').chatConfig(io, usernames);
    /**
     * Listen on provided port, on all network interfaces.
     */
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    }

我有一个基本的想法,这个代码是用于在cpu之间分配任务并保持服务器实时以防一个cpu失败。

问题是:一切正常,直到我需要开始使用node来安排cron工作(将发送电子邮件)。 cron现在由所有工作人员同时运行,电子邮件将发送给工作人员,具体取决于服务器上有多少cpu。通过安排工作我的工作方式:

 if(cluster.isWorker)
 if(cluster.worker.id == 1){
   cron.schedule('*/1 * * * *', function() {
     //CRON JOB
 })
 } 

这在本地系统中工作得很好但在登台服务器上失败可能是因为CPU与这个项目对齐。

有没有办法只获得第一个自由工作者并为他分配任务。

现在我尝试了这个

var wokerArr = []
wokerArr.push(cluster.worker.id)
if(cluster.worker.id == wokerArr[0])
cron.schedule('*/1 * * * *', function() {
    //CRON JOB
})
答案

我用crontab做到了。制作单独的cron文件并使用crontab在命令提示符下安排作业以安排作业。感谢你的支持。

另一答案

您可以在主进程本身中安排cron。 Cron需要以幂等的方式处理。

if (cluster.isMaster) {
  cron.schedule('*/1 * * * *', function() {
     //CRON JOB
  })

  // continue initializing workers here
}

以上是关于Nodejs集群仅将任务分配给一个工作者(任何)的主要内容,如果未能解决你的问题,请参考以下文章

Storm集群上的开发 ,Storm的内部原理,storm提交任务的过程

如何等待 ExecutorService 中的一个正在运行的线程完成分配另一个任务

工作分配算法

在Hadoop集群中,任务分配到每个节点上的传统方法是啥,怎么实现随机分配,均衡分配........

Storm配置运行

jstorm干货