【问题标题】:Node.js Kue autoprocessing jobs if queue is not empty如果队列不为空,Node.js Kue 自动处理作业
【发布时间】:2015-10-27 11:58:09
【问题描述】:

我是 Kue 的新手,有一些问题。希望你能帮助我:)

我阅读了 Kue 的所有文档,但我只看到了一种处理队列中作业的方法:手动处理呼叫。如果队列为空,我需要在队列为空时立即处理作业,如果队列不为空,则在先前完成后运行休息作业。有什么办法吗?谢谢。

或者如果我改写问题:如果特定类型的作业从队列中用完会发生什么?我应该重新开始处理还是会在新作业出现时自动调用?

实际上,我需要及时分发 API 请求,因为服务器端限制了请求。

【问题讨论】:

  • 我第一次听说 Kue 是因为你的问题。这很有趣,可以快速阅读文档。因为没有其他人回答:可能是我没有正确理解它,但是您不能定义一个 Job 事件“入队”,一旦将作业放入队列就触发处理?并在事件“完成”时开始下一个处理。
  • 我可能可以,但这是正确的方法吗?如果我只需要开始处理一次作业,其余的会自动调用怎么办?每个作业完成后都会调用回调,所以当我在队列中有 1 个作业时没关系,但是如果调用了 100 次但只有在队列为空后才会停止处理怎么办? p.s.也可以看看async.queue,也很有意思:)
  • 感谢您的提示。 ;-) async 是我最喜欢的响应式节点开发工具之一,但 kue 是一个带有 redis 存储和 rest 接口的优先级队列。 ;-) 也许我理解你的问题,而 kue 文档完全错误。使用queue.process,您只需定义排队作业的处理方式。您可以根据需要创建任意数量的作业,并且只要您保存,就会自动触发处理。您不必为每个作业调用流程。我认为你想要的是默认行为。
  • 是的,它实际上看起来像那样。但为了完整起见,我在official github 提出了问题,所以,我想,我们需要等待答案:)
  • 我试过了。这是事实 ;-) !有用!如果您没有为事业的工作提供不同的优先级;-)。

标签: javascript node.js kue


【解决方案1】:

我写了一个小 js 脚本:

var kue = require('kue')
  , queue = kue.createQueue();


var job = queue.create('email', {
      title: 'welcome email for tj'
    , to: 'tj@learnboost.com'
    , template: 'welcome-email'
}).save( function(err){
    if( !err ) console.log( job.id );
});

queue.on('job enqueue', function(id, type){
    console.log( 'Job %s got queued of type %s', id, type );

}).on('job complete', function(id, result){

    kue.Job.get(id, function(err, job){
        if (err) return;
        job.remove(function(err){
            if (err) throw err;
            console.log('removed completed job #%d', job.id);
        });
    });
});

queue.process('email', function(job, done){
    console.log("Processing email: " + job.data.title);
    email(job.data.to, done);
});

function email(address, done)
{
  done();
}

var job1 = queue.create('email', {
      title: 'welcome email for tj 2'
    , to: 'tj@learnboost.com'
    , template: 'welcome-email'
}).save( function(err){
    if( !err ) console.log( job1.id );
});

var job2 = queue.create('email', {
      title: 'welcome email for tj 3'
    , to: 'tj@learnboost.com'
    , template: 'welcome-email'
}).save( function(err){
    if( !err ) console.log( job2.id );
});

使用node script.js 运行它会产生以下输出:

29
30
31
Job 29 got queued of type email
Job 30 got queued of type email
Job 31 got queued of type email
Processing email: welcome email for tj
Processing email: welcome email for tj 2
removed completed job #29
Processing email: welcome email for tj 3
removed completed job #30
removed completed job #31

我这样做了很多次 (> 30)。但是有一次删除顺序不是按顺序排列的。但是删除是异步的,所以这是可能的。

Job 8 got queued of type email
Job 9 got queued of type email
Job 10 got queued of type email
Processing email
Processing email
removed completed job #10
Processing email
removed completed job #8
removed completed job #9

输出有点不同,因为我在运行后将标题添加到处理消息中。不幸的是,该示例中的处理顺序不清楚。而且我无法重现它。 :-(

编辑

我添加了一个 for 循环来更好地调查这种行为。并消除惊喜:

它将作业按照其作业 ID 的lexical 顺序缝合。

添加的循环:

for (var i=0; i<20; i++)
{
  var job2 = queue.create('email', {
        title: 'welcome email for tj ' + (i+4)
      , to: 'tj@learnboost.com'
      , template: 'welcome-email'
 }).save();

新的输出:

87
88
109
Job 87 got queued of type email
Job 88 got queued of type email
Job 89 got queued of type email
Job 90 got queued of type email
Job 91 got queued of type email
Job 92 got queued of type email
Job 93 got queued of type email
Job 94 got queued of type email
Job 95 got queued of type email
Job 96 got queued of type email
Job 97 got queued of type email
Job 98 got queued of type email
Job 99 got queued of type email
Job 100 got queued of type email
Job 101 got queued of type email
Job 102 got queued of type email
Job 103 got queued of type email
Job 104 got queued of type email
Job 105 got queued of type email
Job 106 got queued of type email
Job 107 got queued of type email
Job 108 got queued of type email
Job 109 got queued of type email
Processing email: welcome email for tj 14
Processing email: welcome email for tj 15
removed completed job #100
Processing email: welcome email for tj 16
removed completed job #101
Processing email: welcome email for tj 17
removed completed job #102
Processing email: welcome email for tj 18
removed completed job #103
Processing email: welcome email for tj 19
removed completed job #104
Processing email: welcome email for tj 20
removed completed job #105
Processing email: welcome email for tj 21
removed completed job #106
Processing email: welcome email for tj 22
removed completed job #107
Processing email: welcome email for tj 23
removed completed job #108
Processing email: welcome email for tj
removed completed job #109
Processing email: welcome email for tj 2
removed completed job #87
Processing email: welcome email for tj 3
removed completed job #88
Processing email: welcome email for tj 4
removed completed job #89
Processing email: welcome email for tj 5
removed completed job #90
Processing email: welcome email for tj 6
removed completed job #91
Processing email: welcome email for tj 7
removed completed job #92
Processing email: welcome email for tj 8
removed completed job #93
Processing email: welcome email for tj 9
removed completed job #94
Processing email: welcome email for tj 10
removed completed job #95
Processing email: welcome email for tj 11
removed completed job #96
Processing email: welcome email for tj 12
removed completed job #97
Processing email: welcome email for tj 13
removed completed job #98
removed completed job #99

所以当job id从9到10从99到100从999到1000等变化时,这种行为肯定会重现。

【讨论】:

  • 我们应该在 github 上打开一个问题吗?我不认为这是想要的行为
  • 我计划将 Kue 集成到我的一些项目中。我安排了下周五的 2 个小时来调查 Kue 的代码以证明其适用性。也许我会找出问题所在或者是否是通缉行为(我同意你的观点,这几乎不是通缉的行为,但他们可能不保证特定的订单。)。如果您还没有打开问题工具,那么我会打开一个。
  • 这也可能很有趣。原始 kue 肯定缺少它:kue-scheduler。如果你不介意的话,我会把问题留给你 :) 这毕竟是你的发现 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2012-12-26
  • 1970-01-01
  • 2018-01-20
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多