MEANIO群集(共4个)对于计划作业仅运行一次

MEANIO Cluster of 4 to run only once for a scheduled Job?

本文关键字:运行 作业 一次 计划 于计划 群集 4个 MEANIO      更新时间:2024-04-20

我希望看到的是让MEAN旋转所有四个集群。然后每天20:30运行一个预定的作业给我的客户发电子邮件。目前运行不止一次。我该如何做到这一点?

'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

为了澄清,您是否在问为什么调度程序运行不止一次?如果是这样的话,那是因为cluster.fork()的工作方式与unix fork完全一样,它创建了另一个进程,该进程本质上是当前进程的副本。每个进程将在自己的参考框架中安排一个作业,每个进程都将执行该作业。您可能希望通过在if(cluster.isMaster) {内部移动调度来确保仅在主进程中调度作业。

通过这样做,您可以指示主将作业分派给工人。不过,您必须自己添加负载平衡。

您可能会考虑使用作业队列来完成此操作,而不是直接邮寄放置在队列中以及从那里开始的过程。在添加到队列之前,请查看现有任务是否已经存在,从而避免多个实例。我使用过Kue,听说过关于busmq 的好消息