동기(Sync) / 비동기(ASync)
동기, 비동기는 호출하는 요청자의 입장에서 생각해야 합니다.
동기 방식은 요청을 보내면 결과가 올때까지 대기 하는 방식이고 비동기 방식은 요청을 보내고 결과를 통보 받는 방식에서 차이가 있습니다.
정확한 예시는 아니겠으나 이해를 돕기 위해 패스트푸트 가게에서 음식을 시켰을때의 상황을 예를 들어 설명해 보겠습니다.
먼저 '서브웨이'에서 '로티세리치킨' 을 주문을 했다고 가정해 보죠. 먼저 직원이 빵 종류를 선택해 달라고 합니다.
빵은 고소한 '플랫' 으로 선택 하겠습니다. 또 직원이 빼고 싶은 야채가 있는지를 물어 봅니다. 야채는 다 먹어줘야죠 굳이 뺄 필요는 없을 것 같습니다. 또 소스를 고르라고 하네요. 소스는 '스위트어니언 + 랜치' 조합을 주문을 합니다. 더 필요한거 없냐고 물어 봅니다. 콜라도 먹어야 하나 셋트로 해야 겠죠 ? 자 드디어 '로티세리치킨' 샌드위치가 나왔습니다.
보시면 이 모든 과정에 주문자와 직원이 함께하고 요청과 응답이 같은 순간에 끝나는 동기(Sync) 방식으로 이루어진다는 것을 알 수 있습니다.
이와 다르게 '버거킹'에 가서 '통새우와퍼' 를 시켜 보겠습니다.
요청자는 주문을 하고 직원으로 부터 진동벨을 받게 됩니다. 그럼 앉은 자리에서 진동벨이 울리길 기다렸다가 진동벨이 '호출' 되면 카운터에 가서 그냥 내가 주문한 음식을 가지고 오면 됩니다.
여기에서 요청자는 앉은 자리에서 다른일을 하다가 요청한 내용에 대한 '호출(callback)'이 있을때만 개입 하게 됩니다. 이처럼 요청과 응답이 각각 다른 순간에 끝나는 방식이 비동기(ASync) 방식 입니다.
블로킹(Blocking) / 논블로킹(NonBlocking)
자 이제 블로킹(Blocking), 논블로킹(NonBlocking) 에 대해 설명 하려 합니다.
블로킹, 논블로킹은 동기, 비동기와는 다르게 요청자, 제공자 둘다의 입장에서 생각해야 합니다.
블로킹은 하나의 작업을 처리할때 호출된 작업이 끝날때까지 호출한 작업이 기다리면 블로킹 입니다. 논블로킹은 이 반대가 되겠죠.
블로킹, 논블로킹은 동기, 비동기와는 다르게 직접 제어할 수 없는 것을 대상으로 할때 구분 하는 방법 입니다.
다시 '서브웨이' 로 돌아 가겠습니다. 또다시 '로티세리치킨' 의 주문이 들어 왔습니다.
그럼 직원이 빵의 종류, 빼고 싶은 야채를 물어보다가 보니 올리브가 다 떨어졌네요. 직원은 요청자에게 양해를 구하고 올리브를 창고에서 가지고 와서 다시 채워 넣습니다. 이후 동일한 과정을 거치게 됩니다.
이 경우 요청자는 직원이 응답(샌드위치)을 주기전까지 블로킹 상태가 되었다고 볼 수 있습니다. 만약 직원이 오늘 들어온 신입이라 10분만에 샌드위치를 받았다고 하더라도 어쩔 수 없는 상황인 것 입니다.
'버거킹' 에서 '통새우와퍼' 주문이 들어 왔을 경우에는 어떨까요? 요청자는 요청에 대한 응답의 '호출' 이 있기까지 밀린 메일을 본다거나 멍하니 창밖을 본다거나 하면서 기다리고 있습니다.
직원 입장에서 보면 소고기 패티 굽기, 빵 굽기, 야채, 소스를 넣어 조립하기, 포장하기의 모든 과정을 각각의 직원이 맡아서 처리 합니다. 모든 과정이 각자 맡은 일을 진행하면 되기 때문에 병목 되는 곳이 없죠.
요청자는 응답에 대한 호출이 올때까지 다른 작업을 하고 있고 직원은 맡은 일만 하다 보면 '짠' 하고 마법처럼 햄버거가 나오게 됩니다.
이 경우 요청자는 직원이 응답을 호출 할때까지 논블로킹 상태가 되었다고 할 수 있습니다.
정리
동기(Sync) 방식은 요청과 응답이 같은 순간에 끝나는 방식 입니다.
비동기(ASync) 방식은 요청과 응답이 각각 다른 순간에 끝나는 방식 입니다.
블로킹(Blocking) 은 호출된 작업이 끝날때까지 호출한 작업이 기다리는 방식 입니다.
논블로킹(NonBlocking)은 호출한 작업이 호출된 작업을 기다리지 않고 결과를 발행/구독 형태로 통지 하는 방식 입니다.
비동기, 논블로킹 방식은 서버의 Thread 처리 갯수가 늘어 난다거나 계산 속도를 극적으로 빠르게 하지 않습니다.
오히려 발행/구독 형태의 구조를 가지다 보니 단일 작업에서는 성능이 떨어질 수도 있습니다.
하지만 Thread 들이 노는 시간을 극단적으로 줄이는 방식만으로 동일한 자원으로 더 많은 일을 처리할 수 있는 고효율을 달성 하게 합니다.
참조사이트 : jogeum.net/30
'기타 TIP' 카테고리의 다른 글
[Web] RESTful API에 알아보자 (0) | 2021.05.05 |
---|---|
[SERVER] Tomcat catalina Log 관리 (0) | 2021.04.29 |
[Network] 쿠키와 세션 개념 (0) | 2021.03.11 |
[Network] TCP와 UDP의 차이점 (0) | 2021.03.08 |
[Network] 인터넷 통신 (0) | 2021.03.08 |