【发布时间】:2020-05-02 20:05:52
【问题描述】:
我的NodeJS 项目中有多个Bull 队列,如果前一个队列成功执行,它们将运行。
我正在尝试在这里验证一些电子邮件地址。
检查电子邮件格式(formatQueue)
Email Existence 使用
npm email-existence包(existenceQueue)
formatQueue 是一个耗时较少的过程,它将运行 RegEx 并验证 Email 格式。但是email-existence 包大约需要 5-10 秒才能完成。
formatQueue 和 existenceQueue 如果 jobs 较少,例如 20-100,则可以正常工作。但是当我一次添加超过 1000 个工作时,existenceQueue 失败并出现以下错误
myemail@email.com job stalled more than allowable limit
我检查了问题HERE 和HERE,我认为这个过程需要很长时间才能响应,所以添加limiter 作为参考HERE。但这对我没有帮助。
如果任何队列中的作业失败,它不会处理下一个作业。它将停在那里,其他工作将保持在waiting 状态。
我的代码类似于下面的代码。请帮我解决这个问题。
Queue.js
var formatQueue = new Queue('format', "redis-db-url");
var existenceQueue = new Queue('existence', "redis-db-url");
// ------------ function for adding to queue ------------
module.exports.addToQueue = (emails) => {
emails.forEach(element => {
formatQueue.add(element, { attempts: 3, backoff: 1000 });
});
}
// ------------ Queue Process -------------
// Format Test Process
formatQueue.process(function(job, done){
FormatTest.validate(job.data, (err, data) => {
if(err) done();
else{
job.data = data;
done();
}
});
});
// Existence Test Process
formatQueue.process(function(job, done){
ExistenceTest.validate(job.data, (err, data) => {
if(err) done();
else{
job.data = data;
done();
}
});
});
// ------------ On Cmplete Handlers ------------
formatQueue.on('completed', function(job){
if(job.data.is_well_format){
existenceQueue.add(job.data, { attempts: 3, backoff: 1000 });
}else QueueModel.lastStep(job.data)
});
existenceQueue.on('completed', function(job){
QueueModel.lastStep(job.data)
});
// ------------ To update the emaile ------------
module.exports.lastStep = (data) => {
Emails.updateEmail(data, (err, updated) => {
if(!err) {
formatQueue.clean('completed');
existenceQueue.clean('completed');
}
})
}
--------- 更新 ---------
处理器响应时间过长,因此作业收到 stalled 或由于我使用超时而失败。
我正在尝试在不同的processor 文件中运行process,就像在bull 文档中一样,我添加了如下文件。
// -------- Queue.js ----------
formatQueue.process(__dirname+"/processors/format-worker.js");
// On Cmplete Handler
formatQueue.on('completed', function(job, result){
console.log(result, "Format-Complete-job"); // result is undefined
if(job.data.is_well_format){
existenceQueue.add(job.data, { attempts: 3, backoff: 1000 });
}else QueueModel.lastStep(job.data)
});
// -------- Queue.js ends ---------
//format-worker.js
Validator = require("../../validators");
module.exports = (job) => {
Validator.Format.validate(job.data, (data) => {
job.data = data;
return Promise.resolve(data);
});
}
现在在我之前使用的作业完成时,我曾经使用更新的作业参数获取作业数据。现在我没有得到更新的工作数据。文档中的第二个参数,即result 是undefined。
现在如何在这种情况下获取更新的作业数据。
【问题讨论】:
-
这个队列行为正是我想在这里的问题中实现的:stackoverflow.com/questions/61659677/…
-
你好,伙计,在你的情况下,你想停止队列,但在我的情况下,我想更新作业数据并继续处理其他数据。
标签: node.js queue job-queue bull.js bull-queue