MongoDB + Mongoose와 함께 NodeJS 사용.NodeJS 비동기 동작 처리
우선 비동기 비 차단 코드의 장점을 알고 있습니다. 그래서 콜백을 처리합니다. 그러나 마침내 나는 다음과 같은 문제에 직면했다.
사용자가 언제든지 호출 할 수있는 함수가 있다고 가정 해 보겠습니다. 그리고 슈퍼 번개 속도 사용자가 거의 동시에 두 번 호출 할 수도 있습니다. 물론
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
})
}
그것은 다음과 같이 실행합니다 : QUERY 찾기, QUERY 찾기, SAVE QUERY, SAVE QUERY는
이 완전히 (쿼리를 저장 QUERY 찾기, 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 프로세스를 확장하고 실행할 때이 솔루션이 제대로 작동하지 않을지 의심 스럽습니다.
답이 맞습니다. 좋은 습관을 언급합니다. 그러나, 내가 생각하기 - 생각하기 - 생각하기 - 기억해 - SAVE-SAVE (문서 찾기, 무언가 찾기, 다른 문서 찾기, 무언가 실행, 둘 다를 저장). 여기 findAndModify를 사용할 수없는 것 같습니다. 색인 생성을 사용할 수 없다고 생각합니다. Mongo가 두 번째 세이브에서 에러를 던지면 나는 첫 번째 세이브를 롤백 할 수 있습니다. 그렇다면 무엇을합니까? 어떻게 함수를 다시 호출하려고합니까? 따라서 색인을 생성하더라도 문제는 여전히 존재합니다. – igorpavlov
다음 웹 페이지 확인 : http://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/. 2 단계 커밋을 수행하십시오. –
마지막으로, 여기서 내가 필요한 것. 고맙습니다. Redis-MongoDB 하이브리드를 사용할 것입니다. Redis는 비 차단이기 때문에 어쨌든, 당신은 매우 도움이됩니다. 그래서 나는 Redis를 위해 multi를 사용하고 Mongo를 위해 고립을 사용할 것이다. – igorpavlov