node.js中复杂调用的流/模式

时间:2015-07-20 12:11:34

标签: javascript node.js mongodb asynchronous

我正在建立一个社交社区,如果有人赞成/分享他/她的答案,用户将获得奖励。当他/她的回答有一些互动时,我也会向用户发送通知。

我已通过以下代码中的注释解释了流程。 函数post_event暴露给API,流程从那里开始。

var answerController = function(){
    Emitter.call(this);
    var self = this;
    var continueWith = null;

    var push_event = function(event, answerId, likerId, callback){

        // check for data and prepare a bacth of queries
        // has to be done like this coz mongoose doesn't (yet) support nModified, nMatched for update
        var batch = Answer.collection.initializeOrderedBulkOp();
        batch.find(query).upsert().updateOne(update);
        batch.execute(function(err,result) {
            if(err){
                return callback(err);
            }else{
                return callback(null, result.nModified);
            }
        });
    };


    // exposed as an API call for yo/share/view
    // calls push_event
    var post_event = function(req,res, next){

            //check for data in incoming request and pass it forward

            push_event(event,answerId, likerId, function(err, num_updated_docs){
                if(err){
                    return errors.api_error({code: 500, message: err, res: res, next: next});
                }else{
                    if(num_updated_docs){
                        // create the calculateScore_args variable
                        self.emit('calculateScore',calculateScore_args);
                        res.status(200).send({message : 'success'}).end();
                    }else{
                        return errors.api_error({code: 401, message: 'event already exists for user', res: res, next: next});
                    }
                }
            });

    };


    var score = function(args){

        var asyncTasks = [];
        asyncTasks.push(function(cb){
            //update user's score
            // this is a cpu intensive function (does a small matrix multiplication)
        })

        asyncTasks.push(function(cb){
            //update answer's score  (user's score is a function of various answers)
            // another CPU intensive call, calculates confidence interval --->  score
        })

        async.parallel(asyncTasks, function(err, results){
            self.emit('notify', notifyData);
          })

    };

    function notify(args){
        // calls another controller which notifies the user(GCM) and inserts the notification into the DB
        notification.AnswerEvent(args);

    }

    self.on('calculateScore', score);
    self.on('notify',notify);

    return {
        post_event : post_event
    }
};

问题:我想知道这是否是一个可接受约100-200 req / sec的系统的可行模式。如果有人可以建议我跟随其他模式(如消息队列),那将是很棒的。此外,调试事件发射器代码的最佳方法是什么。

由于

1 个答案:

答案 0 :(得分:1)

将CPU密集型代码移出Web服务器是防止阻塞的首要方法。

任务队列是实现此目的的一种非常简单的方法。使用Ruby,我在过去使用https://github.com/resque/resque取得了相当大的成功。

https://github.com/taskrabbit/node-resque等节点端口可能适合您的需要。你基本上创造了一份工作,把它放在一个队列上,然后让一些工人去榨掉所需的工作。