전형적인 서버
전통적인(전형적인)서버는 한 서버내에서 데이터베이스를 가지고 있는 경우도 있고, 클라우드 서버에 데이터베이스를 가지고 있는 경우도 있는 등 다양하게 구성이 가능하다.
보통의 서버는 멀티쓰레딩 환경이기 때문에, Thread Pool 이 있다. 한 서버에서 만들 수 있는 Thread는 제한적이기 때문에 가능한 숫자의 쓰레드들을 보관하고 있는 Pool이 있는 것이다.
클라이언트의 요청이 들어오면, 그 요청을 처리하기위해 서버는 쓰레드를 할당한다. 요청마다 요청을 처리할 수 있는 쓰레드들을 각 클라이언트들에게 할당하는 것이다. 만약 한번에 처리할 수 있는 쓰레드 이상의 요청이 들어오게되면, 그 요청은 처리할 수 있는 쓰레드가 생길때까지 기다렸다가 요청을 처리한다.
식당으로 예를 들자면, 종업원(쓰레드)가 모든 작업을 한다고 볼 수 있다. 종업원(쓰레드)마다 주문을 받고 요리하는 것부터 서빙하는 것까지 다 처리하기때문에 손님이 많은 경우에는, 손님은 종업원의 일이 다 끝날때까지 기다려야한다.
Node js 서버 장/단점 ✅
노드 서버의 동작 방식은 조금 다르다. 노드 서버는 하나의 메인 싱글 스레드가 있다. 클라이언트의 요청이 들어오면, 하나의 쓰레드가 해야할 일을 각 요청을 처리할 수 있는 곳에 던진다(?)
즉, 하나의 쓰레드가 요청을 받아서 그 요청이 다 완료될 때까지 기다리는게 아니라, 요청을 받은 다음 필요한 일들을 처리할 수 있는 데이터베이스나 네트워크에 위임함으로써 여러가지 요청을 빠르게 처리할 수 있다.
똑같이 식당으로 예를 들자면, 전형적인 서버와 달리 주문을 받을 수 있는 종업원(스레드)이 따로 있다고 볼 수 있다. 종업원이 모든 주문을 받고 손님들에게 티켓을 나눠준다. 그럼 종업원은 주방에 있는 전문 요리사(데이터베이스, 네트워크 등)에게 만들어야할 요리를 전달하고, 요리가 완성이 되면 차례대로 서빙하는 사람이 티켓 번호에 따라 요리를 전달한다.
물론, 주방에 얼마나 많은 요리사가 있냐에 따라 한번에 얼마나 많은 음식을 만들 수 있는지가 결정되지만, 적어도 종업원은 다수의 요청을 빠르게 처리할 수 있다.
노드 서버는 Non-Blocking I/O , Event-Driven 방식으로 파일이나 데이터베이스를 읽고 쓰거나, 네트워크 처리를 하는데는 훨씬 효율적이라 볼 수 있다.
단, 노드 서버는 cpu가 무거운 일(이미지 처리/ 비디오 처리 등)에는 부족할 수 있다.
만약 노드로 cpu가 무거운 일을 하고 싶다면 분산서버를 만들거나, aws lamda, google cloud 를 이용해서 처리하는 방법도 있다.