Node.js NodeJS Bull停止作业上的队列作业失败

Node.js NodeJS Bull停止作业上的队列作业失败,node.js,queue,job-queue,bull.js,bull-queue,Node.js,Queue,Job Queue,Bull.js,Bull Queue,我的NodeJS项目中有多个队列,如果成功执行前一个队列,将运行这些队列。 我正在这里验证一些电子邮件地址 检查电子邮件格式(formatQueue) 使用npm电子邮件存在包(存在性) formatQueue是一个耗时较少的过程,它将运行RegEx并验证Email格式。但是电子邮件存在程序包大约需要5-10秒才能完成 formatQueue和existenceQueue如果作业较少,如20-100,则工作正常。但当我一次添加超过1000个作业时,existenceequeue失败,错误如下 m

我的
NodeJS
项目中有多个队列,如果成功执行前一个队列,将运行这些队列。 我正在这里验证一些电子邮件地址

  • 检查电子邮件格式(formatQueue)

  • 使用
    npm电子邮件存在
    包(存在性)

  • formatQueue
    是一个耗时较少的过程,它将运行
    RegEx
    并验证
    Email
    格式。但是
    电子邮件存在
    程序包大约需要5-10秒才能完成

    formatQueue
    existenceQueue
    如果
    作业较少,如20-100,则工作正常。但当我一次添加超过1000个作业时,
    existenceequeue
    失败,错误如下

    myemail@email.com job stalled more than allowable limit
    
    我检查了这个问题,我认为这个过程需要很长时间才能响应,所以添加了
    限制器
    。但这对我没有帮助

    如果队列中的某个作业失败,则该作业不会处理下一个作业。它将在那里停止,其他作业将保持在等待状态

    我的代码与下面的代码类似。请帮我解决这个问题

    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');
            }
        })
    }
    
    ------更新----------------

    处理器的响应时间太长,因此作业被暂停或失败,因为我使用了超时

    我试图在不同的
    处理器
    文件itsef中运行
    进程
    ,作为其在
    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);
        });
    }
    
    现在,在我以前使用的“作业完成”中,我使用更新的作业参数获取作业数据。现在我没有得到最新的工作数据。文档中的第二个参数,即
    结果
    未定义
    。 现在,在这种情况下,如何获取更新的作业数据。

    尝试可重复作业

    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 => {
        let jobOptions = {
          repeat: {
            every: 10 * 1000, // Run job every 10 seconds for example
            limit: 3 // Maximum number of times a job can repeat.
          },
          jobId: someUniqueId, // important do not forget this
          removeOnComplete: true, // removes job from queue on success (if required)
          removeOnFail: true // removes job from queue on failure (if required)
        }
    
        formatQueue.add(element, jobOptions);
      });
    }
    
    // ------------ Queue Process -------------
    
    // Format Test Process
    formatQueue.process(function (job, done) {
      FormatTest.validate(job.data, (err, data) => {
        if (err) {
          // Done with error
          done(true);
        } else {
          job.data = data;
          // Done without any error
          done(false);
        }
      });
    });
    
    // Existence Test Process
    existenceQueue.process(function (job, done) {
      ExistenceTest.validate(job.data, (err, data) => {
        if (err) {
          // Done with error
          done(true);
        } else {
          job.data = data;
          // Done without any error
          done(false);
        }
      });
    });
    
    
    // ------------ On Complete Handlers ------------
    formatQueue.on('completed', function (job) {
      if (job.data.is_well_format) {
        let jobOptions = {
          repeat: {
            every: 10 * 1000, // Run job every 10 seconds for example
            limit: 3 // Maximum number of times a job can repeat.
          },
          jobId: someUniqueId, // important do not forget this
          removeOnComplete: true, // removes job from queue on success (if required)
          removeOnFail: true // removes job from queue on failure (if required)
        }
    
        existenceQueue.add(job.data, jobOptions);
      } else QueueModel.lastStep(job.data)
    });
    
    existenceQueue.on('completed', function (job) {
      QueueModel.lastStep(job.data)
    });
    
    
    // ------------ To update the email ------------
    module.exports.lastStep = (data) => {
      Emails.updateEmail(data, (err, updated) => {
        if (!err) {
          formatQueue.clean('completed');
          existenceQueue.clean('completed');
        }
      })
    }
    
    

    这种队列行为正是我想在这里的问题中实现的:您好,伙计,在您的情况下,您希望停止队列,但在我的情况下,我希望不更新作业数据并继续处理其他数据。您好,我认为此ePeat作业对吗?这与那个错误有什么关系?你能解释一下吗!这样我以后才能有更好的了解!在GitHub上的一个回答中,有人提到这是Mongoose的问题,通过增加poolSize值,可以消除这个错误。在我的例子中,将运行1000多个查询,每次调用lastStep函数时,将发生两件事。11它将更新电子邮件数据,并检查列表中的所有电子邮件是否已完成,如果是,它将更新列表状态。这会影响队列的处理吗?是的,上面的代码会重复作业,但通过使用RemovePeatable,您可以在第一次成功时停止重复,还可以结合removeOnComplete和removeOnFail,使其更加健壮。即使有大量的文档,我也在努力消化这头公牛。如果答案没有帮助,就放弃它。看看这个回购协议:当然可以。我试试看,然后再打给你!