해결된 질문
작성
·
202
3
createblog가 awiat 하는 동안 또 불리면 어떻게 되나요?
예를들어 여러명의 유저가 동시에 createBlog를 호출하게되면
계속 await하고 다음거 await 처리할때까지 대기 하고 있을 것 같은데... 이런 경우 어떻게 처리되나요??
답변 3
1
1
ㄴ 아하 어떻게 작동되는지 이해가 되었네요. 친절한 답변감사합니다.
어떻게 처리해야되는지 알겠어요. 저는 request받는 부분에서 따로 처리를 하려고 했는데 말씀들어보니 굳이 그렇게 처리안해도 nodejs에서 알아서 처리되는군요. 물론 request가 몰리는 쪽에서는 처리가 필요할 것 같긴한데,
어쨌든 친절한 답변감사합니다.
1
앗 아니에요. 비동기 프로그래밍에서는 이 경우에 서로 대기하지 않아요
await를 하게 되면 하나의 API request 안에서 "기다렸다가" 다음 코드를 순차적으로 실행하게 되요. 같은 API request(블로그 생성)를 (여러 유저가 혹은 같은 유저가) 동시에 여러번 호출하게 되면 이건 await와 상관 없이 비동기적으로(체감상 병렬) 처리되요.
await하는 동안 노드 서버가 놀지 않고 계속 request를 받을 수 있는게 비동기의 장점이에요!
일반적인 동기 프로그래밍이라면 외부 호출 결과를 기다리는 동안 해당 request에 할당된 서버의 자원은 일을 못하게 되죠. 비동기가 지원되지 않는 경우는 그래서 보통 request가 발생할 때마다 새로운 thread(컴퓨터 자원)을 할당해줘요. request처리가 끝나면 할당받은 thread를 풀어주게 되고요. 만약 한번에 최대 100개 thread를 만들 수 있는 서버인데 동시에 호출이 100번 이상 들어오게 되면 이후 호출들은 작성자님 말씀대로 전에 호출들이 끝나는걸 대기하고 있다가 처리하게 되요.
그런데 노드가 비동기적으로 처리를 잘 하더라도 동시에 호출이 많이 들어오면 응답속도가 조금씩 늘어날 수 있어요. 노드 서버는 비동기적으로 빠르게 많은 request를 동시다발적으로 처리해요. 하지만 안에서 await하는 외부 요소들(데이터베이스)이 부하가 걸려서 원래 50ms면 응답이 왔던게 60ms, 70ms 이런식으로 늘 수도 있겠죠? 그러면 전체 응답속도도 같이 늘게되죠.
그래도 비동기로 처리하는게 훨씬 효율적이에요! 평상시에 디비 호출이 50ms 소요했다고 하면 50ms 중에 거의 49ms는 네트워크로 보내고 받는데 소요되는 시간이라고 할 수 있어요(대략적으로 비율을 보면요). 실질적으로 디비에서 작업하는 시간은 1ms도 안될 수 있어요. 디비에 부하가 가서 처리되는 시간이 1ms에서 2, 3ms로 늘 수는 있겠죠. 네트워크 통신 시간(49ms)이 대부분이기 때문에 디비처리 속도(1~3ms)가 조금 느려지더라도 체감상 변화가 거의 없게 되죠. 디비 호출 응답시간 변동이 50~150ms가 아니라 50~53ms 정도만 되는거에요.
물론 호출 수가 동시에 엄청 많아지면 다른 예기인데 이건 또 다른 해결책이 있습니다!