Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Bull queue:Khi một công việc không thành công, làm thế nào để ngăn hàng đợi xử lý các công việc còn lại?

Trong bull Không thể lặp lại cùng một công việc ngay sau khi thất bại trước khi chọn công việc tiếp theo trong hàng đợi.

Giải pháp:

  1. Tạo công việc mới và đặt mức độ ưu tiên của nó thành một giá trị nhỏ hơn loại công việc hiện tại.
  2. Giải phóng công việc không thành công (resolve() hoặc done() )
  3. Công việc mới này sẽ được nhận ngay lập tức bởi bull để xử lý.

Mã mẫu:Trong mã dưới đây Job-3 sẽ thất bại và tạo công việc mới, v.v. cho đến khi "mục đích của công việc" thành công vào một thời điểm nào đó.

var Queue = require('bull');

let redisOptions = {
  redis: { port: 6379, host: '127.0.0.1' }
}
var myQueue = new Queue('Linear-Queue', redisOptions);

myQueue.process('Type-1', function (job, done) {
  console.log(`Processing Job-${job.id} Attempt: ${job.attemptsMade}`);
  downloadFile(job, async function (error) {
    if (error) {
      await repeatSameJob(job, done);
    } else {
      done();
    }
  });
});

async function repeatSameJob(job, done) {
  let newJob = await myQueue.add('Type-1', job.data, { ...{ priority: 1 }, ...job.opts });
  console.log(`Job-${job.id} failed. Creating new Job-${newJob.id} with highest priority for same data.`);
  done(true);
}

function downloadFile(job, done) {
  setTimeout(async () => {
    done(job.data.error)
  }, job.data.time);
}

myQueue.on('completed', function (job, result) {
  console.log("Completed: Job-" + job.id);
});

myQueue.on('failed', async function (job, error) {
  console.log("Failed: Job-" + job.id);
});

let options = {
  removeOnComplete: true, // removes job from queue on success
  removeOnFail: true // removes job from queue on failure
}

for (let i = 1; i <= 5; i++) {
  let error = false;
  if (i == 3) { error = true; }

  setTimeout(i => {
    let jobData = {
      time: i * 2000,
      error: error,
      description: `Job-${i}`
    }
    myQueue.add('Type-1', jobData, options);
  }, i * 2000, i);
}

Đầu ra:




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sử dụng biến sed trên xargs không hoạt động bên trong mở rộng shell

  2. ServiceStack:Khôi phục đường dẫn khi gọi một Dịch vụ theo cách thủ công?

  3. Làm thế nào để sử dụng Redis trong một chương trình C ++?

  4. 6 chỉ số giám sát Redis quan trọng bạn cần xem

  5. Thiết kế bảng cơ sở dữ liệu Redis như SQL?