gpt4 book ai didi

javascript - Node.js 中复杂调用的流程/模式

转载 作者:行者123 更新时间:2023-12-03 09:30:41 24 4
gpt4 key购买 nike

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

我已经通过以下代码中的注释解释了流程。函数 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 个请求的系统来说,这是否是一种可行的模式。如果有人可以建议我遵循其他模式(例如消息队列),那就太好了。另外,调试事件发射器代码的最佳方法是什么。

谢谢

最佳答案

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

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

Node 端口,例如 https://github.com/taskrabbit/node-resque可能适合您的需求。基本上,您创建一个作业,将其放入队列,然后启动一些工作线程来完成所需的工作。

关于javascript - Node.js 中复杂调用的流程/模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com