Mám více pracovních míst na pozadí procesory nastavit pomocí bull balíček jako níže
import { CronJob } from 'cron';
import Queue from 'bull';
let queue = new Queue('workers', {
// settings: { lockDuration: 60 * 20000 },
defaultJobOptions: {
removeOnComplete: true
},
});
queue
.on('waiting', function(jobId) {
// A Job is waiting to be processed as soon as a worker is idling.
// workerLogger.info(`Job ${jobId} waiting to be processed `);
})
.on('completed', async(job, result) => {
workerLogger.info(`Job ID: ${job.id}, Result: ${result}`);
try {
const jobbed = await queue.getJob(job.id);
if (jobbed) {
await jobbed.remove();
workerLogger.info(`removed completed job ${job.id}`);
}
} catch (error) {
throw new Error(error);
}
})
.on('failed', function(job, err) {
workerLogger.error('job ' + job.id + ' in queue failed... ' + err);
})
.on('error', function(err) {
workerLogger.error('Queue Error... ' + err);
})
.on('stalled', function(job) {
workerLogger.info(
`stalled job, restarting it again! ${job.queue.name} ${JSON.stringify(
job.data,
)} ${job.id} ${job.name}`,
);
});
queue.process('healthCheckPing', concurrency, function(job, done) {
jobs.healthCheckPing(job.data, done);
});
queue.process('test', concurrency, function(job, done) {
jobs.test(job.data, done);
});
Snažil jsem se běží práce na základě Crontime pomocí cron balíček, ale pouze jednu práci dostane zpracované, prosím, podívejte se na vzorek níže
const cron = new CronJob({
cronTime: '* * * * *',
onTick: function() {
(() => {
workerLogger.info('Pushing test to queue...');
queue.add('test');
queue.add(
'healthCheckPing',
{
jobName: 'test',
},
);
})();
},
start: true,
timeZone: 'Africa/Lagos',
});
Snažil jsem se hodně věcí, aby to fungovalo ale nic zdá se k práci, bude seznam několik níže
- běží čekají fronty.vyhladit({ platnost: true });
- běží pracovník procesor na samostatné instance
- přidat zpoždění na práci - fronty.add('test',{}, {delay:500});
- přidání přednost práci - fronty.add('test',{}, {priorita:1});
Ze dvou Míst(test, healthCheckPing) výše, pouze jeden, vždy se spustí.
to znamená, že buď práci jménem test zpracovaný, zatímco druhý nikoli, nebo název úlohy healthCheckPing zpracovaný, zatímco druhý není
Je to práce procesoru funkcí níže
const jobs = {};
jobs.test = (_, done) => {
try {
workerLogger.error('test');
done(false, 'ok');
} catch (e) {
done(e);
}
};
jobs.healthCheckPing = async({
jobName
}, done) => {
try {
workerLogger.info('health check pinger');
if (!jobName) throw new Error('uuid not passed');
// jobname is the slug for monitor
// use pingkey to negate between staging and prod monitors
const pingKey = !process.env.NODE_ENV || process.env.NODE_ENV !== 'production' ?
process.env.STAGING_HEALTH_CHECK_KEY :
process.env.PROD_HEALTH_CHECK_KEY;
const url = `https://hc-ping.com/${pingKey}/${jobName}`;
await axios.get(url);
done(false, `pinged ${jobName}!`);
} catch (error) {
done(error);
}
};
export default jobs;
Tento kód funguje perfektně na mém lokálním počítači, ale tento problém pouze nastane, když na produkci. Uzel server je spuštěn pomocí pm2(cluster režimu, instance = 1)