2

嗨,我正在使用kueclusterredis、node.js。这是一个非常简单的例子,稍后我将从外部调用测试函数。

我的目的是将一些传入的作业添加到队列中并使用 workers 处理它。

在我的情况下,当用户使用我的应用程序完成订单时,他会收到一封电子邮件。我会将电子邮件详细信息发送到队列并使用工作人员处理它。

var cluster         = require('cluster');
var kue             = require('kue');


var jobs = kue.createQueue();
var max_workers     = 3;


function test() {

    jobs.create('email', {
        title: 'welcome email for tj'
        , to: 'tj@learnboost.com'
        , template: 'welcome-email'
    }).save( function(err){
        if( !err){} console.log( "no error");
    });

    if( cluster.isMaster ) {

        for (var i = 0; i < max_workers; i++) {
            cluster.fork();
            console.log("forked -> "+i);
        }

    } else {

        jobs.process('email', function(jobs, done){

            console.log('Job', jobs.id, 'is done');
            done && done();

        });
    }

}

setInterval(test,3000);

当我运行脚本时,node test.js我得到了这个输出

forked -> 0
forked -> 1
forked -> 2
no error
forked -> 0
forked -> 1
forked -> 2
no error
no error
no error
no error
forked -> 0
forked -> 1
forked -> 2
no error
no error
no error
no error
no error
no error
no error
forked -> 0
forked -> 1
forked -> 2
no error
no error
no error
no error
no error
no error
no error
no error
no error
no error
forked -> 0
forked -> 1
forked -> 2
no error
no error
no error
no error
no error
no error
no error
no error
no error
no error
no error
no error
no error
forked -> 0
forked -> 1
forked -> 2
no error
no error
no error
no error
Job 176 is done
no error
Job 177 is done
no error
no error
no error
no error
no error
Job 178 is done
no error
no error
no error
Job 179 is done
no error
no error
no error

并继续....

所以我可以看到,主进程不时运行,并且再次 fork() 子进程,并且工作也正在完成。

我的问题是

  • 这是正确的模型吗?(我的目的是将一些传入的作业添加到队列中并使用工人处理它)
  • 每次我使用 jobs.create() 创建作业时,我的作业队列是重新创建还是只是将新作业附加到现有队列?
  • 当主进程再次派生子进程时,如果一个工作人员正在做一些工作,他会完成这项工作还是该工作将停止未完成?

几天我试图自己理解但仍然有疑问,如果有人能解释这些背后的逻辑,我将不胜感激:)

提前致谢 。

4

0 回答 0