MongoDB + Mongoose で NodeJS を使用する。
まず、非同期ノンブロッキング コードの利点を知っています。だから私はコールバックを扱います。しかし、最終的に次の問題に直面しました。
ユーザーがいつでも呼び出すことができる関数があるとしましょう。また、超「電光石火」のユーザーがほぼ同時に 2 回呼び出すことも可能です。
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
これは、アプリのロジックを完全に壊します (FIND QUERY、SAVE QUERY、FIND 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
}
}
それで、私の質問は次のとおりです。それは良い習慣ですか、良いハックですか、それとも悪いハックですか? それが悪いハックである場合は、他の解決策を提供してください。特に、複数の NodeJS プロセスをスケーリングして起動する場合、このソリューションが機能するとは思えません。