2012-01-27 3 views
3

Мне бы хотелось, чтобы jobs.create не смог выполнить идентичное задание в системе. Есть ли способ сделать это?уникальные задания с kue для node.js

Мне нужно выполнить одну и ту же работу каждые 24 часа, но некоторые задания могут занимать более 24 часов, поэтому мне нужно быть уверенным, что задание еще не в системе (активна, в очереди не выполнена) до добавив его.

ОБНОВЛЕНО: Хорошо, я собираюсь упростить проблему, чтобы иметь возможность объяснить ее здесь. Допустим, у меня есть служба аналитики, и я должен отправлять отчет своим пользователям один раз в день. Заполнение этих отчетов несколько раз (всего несколько случаев, но это возможность) занимает несколько часов даже больше, чем один день.

Мне нужен способ узнать, какие текущие задания выполняются во избежание дублирования заданий. Я не мог найти что-либо в API'''kue'''a, чтобы узнать, какие рабочие места в настоящее время работают. Также мне нужно какое-то событие, когда нужно больше рабочих мест, а затем позвоните моему продюсеру getMoreJobs.

Возможно, мой подход неправильный, если да, пожалуйста, дайте мне знать лучший способ решить мою проблему.

Это мой упрощенный код:

var kue = require('kue'), 
    cluster = require('cluster'), 
    numCPUs = require('os').cpus().length; 

numCPUs = CONFIG.sync.workers || numCPUs; 

var jobs = kue.createQueue(); 

if (cluster.isMaster) { 
    console.log('Starting master pid:' + process.pid); 
    jobs.on('job complete', function(id){ 
    kue.Job.get(id, function(err, job){ 
     if (err || !job) return; 
     job.remove(function(err){ 
      if (err) throw err; 
      console.log('removed completed job #%d', job.id); 
     }); 
    }); 

    function getMoreJobs() { 
     console.log('looking for more jobs...'); 
     getOutdateReports(function (err, reports) { 
      if (err) return setTimeout(getMoreJobs, 5 * 60 * 60 * 1000); 

      reports.forEach(function(report) { 
       jobs.create('reports', { 
        id: report.id, 
        title: report.name, 
        params: report.params 
       }).attempts(5).save(); 
      }); 

      setTimeout(getMoreJobs, 60 * 60 * 1000); 
     }); 
    } 

    //Create the jobs 
    getMoreJobs(); 

    console.log('Starting ', numCPUs, ' workers'); 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 

    cluster.on('death', function(worker) { 
     console.log('worker pid:' + worker.pid + ' died!'.bold.red); 
    }); 

} else { 
    //Process the jobs 
    console.log('Starting worker pid:' + process.pid); 
    jobs.process('reports', 20, function(job, done){ 
     //completing my work here 
     veryHardWorkGeneratingReports(function(err) { 
      if (err) return done(err); 
      return done(); 
     }); 
    }); 
} 
+0

Дополнительная информация, код или что-то еще ... – Teemu

+0

@Teemu Я обновил свой вопрос, спасибо! – aartiles

ответ

2

Посмотрите на https//github.com/LearnBoost/kue.

В скрипте json.js проверьте строки 64-112. Там вы найдете методы, которые возвращают объект, содержащий задания, также фильтруются с типом, состоянием или идентификатором. (jobRange(), jobStateRange(), jobTypeRange().)

Прокрутка вниз главная страница JSON API -сече-, вы найдете примеры возвращенных объектов.

Это как звонить и использовать те методы, которые вы знаете гораздо лучше, чем я.

jobs.create() не удалось, если вы передадите неизвестное ключевое слово. Я бы создал функцию, чтобы проверить текущее задание в forEach -loop и возвращает ключевое слово. Затем просто вызовите эту функцию вместо литерального ключевого слова в jobs.create() -параметрах.

Информация, полученная с помощью этих методов в json.js, может помочь вам создать этот «moreJobToDo» -event.

+0

спасибо, эти методы мне очень помогли – aartiles

3

Ответ на один из ваших вопросов заключается в том, что Kue помещает задания, которые он выталкивает из очереди redis в «active», и вы никогда не получите их, если не будете искать их.

Ответ на другой вопрос заключается в том, что ваша распределенная рабочая очередь является потребителем, а не производителем заданий. Смешивая их, как будто вы в порядке, но это мутная парадигма. То, что я сделал с Kue, - это сделать оболочку для json api для kue, чтобы задание можно было помещать в очередь из любой точки системы. Поскольку вы, похоже, нуждаетесь в работе с лопатой, я предлагаю написать отдельное приложение-производитель, которое ничего не делает, кроме как получать внешние задания и вставлять их в рабочую очередь Kue. Он может отслеживать рабочую очередь для того, когда задания работают на низком уровне, и загружать пакет или что я делаю, - это сделать так, чтобы он делал совпадение заданий так быстро, как мог, и разматывать несколько экземпляров вашего потребительского приложения для обработки нагрузки быстрее.

Чтобы повторить повторное использование: ваше разделение проблем здесь не очень хорошее. У вас должен быть производитель заданий, который полностью отделен от вашего потребительского приложения задачи.Это дает вам больше гибкости, простоты масштабирования (просто запустите другого потребителя на другой машине, и вы масштабируетесь!) И общая легкость управления кодом. Вы также должны разрешать, если возможно, тем, кто предоставляет вам эти задачи, которые вы «ищите», получаете доступ к JSON api вашего сервера Kue вместо того, чтобы идти и находить их. Работодатель может планировать свои собственные задачи с помощью Kue.

+2

(Да, я знаю, что я отвечаю на старый вопрос, но я инвестировал в то, что Q & A SE содержат правильные ответы, когда это возможно) –

Смежные вопросы