我正在建立一个社交社区,如果有人赞成/分享他/她的答案,用户将获得奖励。当他/她的回答有一些互动时,我也会向用户发送通知。
我已通过以下代码中的注释解释了流程。 函数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的系统的可行模式。如果有人可以建议我跟随其他模式(如消息队列),那将是很棒的。此外,调试事件发射器代码的最佳方法是什么。
由于
答案 0 :(得分:1)
将CPU密集型代码移出Web服务器是防止阻塞的首要方法。
任务队列是实现此目的的一种非常简单的方法。使用Ruby,我在过去使用https://github.com/resque/resque取得了相当大的成功。
https://github.com/taskrabbit/node-resque等节点端口可能适合您的需要。你基本上创造了一份工作,把它放在一个队列上,然后让一些工人去榨掉所需的工作。