我已经设置kue与Cluster模块一起运行,该模块为每个可用的CPU核心生成kue
子进程..
当调度程序将every
键插入redis时,一切似乎都是有序的 - 每个every
运行只有一个键集。
然而,当触发作业处理的时间到来时,所有子进程(工作者)开始处理处理逻辑,这导致作业具有从单个"调度程序"触发的多个实例。条目。
在kue
中以编程方式触发新作业时似乎不会出现此症状,使用kue
API时也不会发生这种情况。
请告知。
主要引导代码
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
require('./init.js');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('online', function (worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function (worker, code, signal) {
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
});
require('./scheduler.js');
} else {
require("./job_types");
}
init.js
/// Module Dependency
var cors = require('cors');
var kue = require('kue-scheduler');
var express = require('express');
var bodyParser = require('body-parser');
var config = require('./configs/config');
var redis = require("redis");
var client = redis.createClient();
var jobs = kue.createQueue();
require('./routes');
// Clearing redis for clean startup
console.log('Clearing old Redis data...');
client.flushall();
/// Webserver
var corsOptions = {origin: '*'};
var app = express();
app.use(cors(corsOptions));
app.options('*', cors(corsOptions));
app.use(bodyParser.json());
app.use(kue.app);
app.listen(config.env.port, function () {
var host = config.env.host;
var port = config.env.port;
console.log('[' + process.pid + '] Monitoring kue listening at http://%s:%s', host, port);
});
// Handling safe shutdown
process.once('SIGTERM', function (sig) {
kue.shutdown(5000, function (err) {
console.log('[' + process.pid + '] Kue shutdown: ', err || '');
process.exit(0);
});
});
process.on('uncaughtException', function (err) {
console.log('[' + process.pid + '] ' + err);
console.log('[' + process.pid + '] ' + err.stack);
});
scheduler.js
var scheduler = require('kue-scheduler');
var q = scheduler.createQueue();
// Set specific job scheduling here
q.every('1 minutes', q.createJob('getSocialEntities').attempts(3).priority('normal'));
// General scheduler event handling
// Uncomment for debug
q.on('already scheduled', function (job) {
console.log('[' + process.pid + '] job is already scheduled: ' + job.type + ' (' + job.id + ')');
});
q.on('schedule success', function (job) {
console.log('[' + process.pid + '] job scheduled: ' + job.type + ' (' + job.id + ')');
});
q.on('schedule error', function (error) {
console.error('[' + process.pid + '] failed scheduling job');
console.error(error);
});
jobs.process('job type',...)
方法来处理所有作业逻辑本身。