Server

웹서버 비동기 방식과 동기 방식의 차이점, 장단점, 특징

기기디 2018. 8. 16. 15:32

웹서버에서 요청을 처리하는 방식은 크게 동기방식과 비동기방식 두 가지로 나누어 볼 수 있다


1. 동기방식

웹서버에 클라이언트로부터 요청이 들어왔을때 스레드풀에서 스레드를 꺼내거나 프로세스를 복제하는 방식으로

요청이나 연결당 스레드 혹은 프로세스를 할당하여 처리하는 방법을 말한다. 


1 - 1 동기방식의 장점

-서버의 사양이 넉넉해서 많은 스레드를 감당해낼수 있는 경우 성능이 좋다

-요청의 갯수가 적고 요청의 크기가 큰 경우 동기방식을 이용하는게 좋다. 


1 - 2 동기방식의 단점 

-입출력 요청이 있을때 입출력처리가 끝날때까지 스레드가 메모리버퍼에 데이터를 차지하기 때문에 입출력요청이 처리되는 동안 메모리가 낭비되는 상황이 생길 수 있다.

-요청의 갯수가 많아지면 많아질수록 스레드를 생성하므로 많은 요청이 들어오는 경우 입출력요청을 기다리는 것 만으로 서버메모리를 점유하기 때문에 전체적인 성능저하의 원인이 될 수 있다.

-요청의 갯수만큼 쓰레드를 생성하기에 쓰레드가 너무 많이 생성되고 입출력을 결과를 기다리는 것 만으로 메모리를 잡아먹기에 비효율적이다


참조 -http://tech.kakao.com/2016/05/04/asynchronous-programming-and-monad-transformers-in-scala/


prefork방식과 worker방식의 차이

prefork방식은 문제를 처리하기 위해 프로세스를 복제하여 처리하고 worker방식은 커널 영역을 제외하고 복제하여 prefork방식에 비해서 오버헤드가 적다. 대신 worker방식은 하나의 스레드에 문제가 생겼을때 전체 process가 죽을 수 있다고 한다 

참조 - http://dev-ahn.tistory.com/107?category=633819 


2. 비동기 방식(Event-driven)

요청을 받는 스레드와 요청에 대해 처리하는 스레드를 따로 두는 방식이다.

요청을 받는 스레드에서는 요청을 blocking없이 지속적으로 받으면서 입출력이 필요한 요청은 요청을 처리하는 스레드로 따로 보내놓고 입출력 처리가 끝났을때 결과를 따로 통지받아 클라이언트에게 리턴한다. 


2 - 1 비동기 방식의 장점

요청에 따라 스레드를 새로 생성하는 것이 아니기에 동기방식에 비해서 메모리 점유율이 낮다

입출력 작업이 이루어지는 동안 메모리를 점유하지 않는다.

이렇게 처리 할 경우 입출력 요청으로 인해서 끊김 없이 계속해서 요청을 받을 수 있다.

 

2 - 2 비동기 방식의 단점

-요청을 처리하는데 시간이 오래 걸린다면 적합하지 않다

-작업이 크기가 커서 cpu를 많이 잡아 먹는 경우 다수의 요청을 처리하기에 적합하지 않다.

참조 - http://seorenn.blogspot.com/2011/05/nodejs_26.html

참조 - http://zabdahan.tistory.com/entry/%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%84%9C%EB%B2%84%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0


내 서비스의 경우 좋은 서버를 사용하기 어려워서 사양대비 효율적인 웹서버를 사용해야한다고 생각했기 때문에 event-driven방식을 기준으로 삼았다.


cpu성능이 좋다면 데이터처리가 빠른 worker방식을 선호하지만 woker방식을 사용했을때 하나의 스레드라도 고장이 나면 

전체 스레드에 영향을 줄 수 있다고 함

출처 - https://m.blog.naver.com/PostView.nhn?blogId=noorol&logNo=140199393519&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F