将 NodeJS 与 MongoDB+Mongoose 一起使用。
首先,我知道异步非阻塞代码的优点。所以我确实处理回调。但最后我遇到了以下问题。
假设我有一个用户可以随时调用的函数。而且有可能,一个超级“闪电般”的用户几乎同时调用了两次。
function do_something_with_user(user_id){
User.findOne({_id:user_id}).exec(function(err,user){ // FIND QUERY
// Do a lot of different stuff with user
// I just cannot update user with a single query
// I might need here to execute any other MongoDB queries
// So this code is a set of queries-callbacks
user.save() // SAVE QUERY
})
}
当然它是这样执行的:FIND QUERY, FIND QUERY, SAVE QUERY, SAVE QUERY
这完全打破了应用程序的逻辑(应该查找查询、保存查询、查找查询、保存查询)。所以我决定通过为特定用户“锁定”整个函数来防止异步行为(所以函数代码内部仍然是异步的)。
var lock_function_for_user = {}
function do_something_with_user(user_id){
if(!lock_function_for_user[user_id]){
lock_function_for_user[user_id] = true
User.findOne({_id:user_id}).exec(function(err,user){
// Same code as above
user.save(function(){
lock_function_for_user[user_id] = false
})
})
} else {
setTimeout(function(){
do_something_with_user(user_id)
},100) // assuming that average function execution time is 100ms in average
}
}
所以,我的问题是:这是一个好的做法,好的 hack 还是坏的 hack?如果这是一个糟糕的黑客,请提供任何其他解决方案。特别是,当我们扩展和启动多个 NodeJS 进程时,我怀疑这个解决方案是否会起作用。