본문 바로가기

기술들/Today I Learned

Node.js architecture 정리

Node.js를 공부하고 사용해보면서 이 스택이 어떤 구조를 이루고 동작하는지 궁금했다. 그것에 대해 내가 이해한데로 간략히 정리해보려고 한다. 

 

대부분의 유명한 서버용 프로그래밍 언어들이 Multi-thread 방식을 지원하는 것과는 달리 Node.js는 한 번에 단 하나의 작업만을 처리하는 Single-thread를 지원한다. 멀티쓰레드를 사용하면 빠르게 여러 요청들을 동시에 처리할 수 있지만, 요청 하나마다 서버자원을 이용해서 쓰레드를 생성시키기 때문에 서버에 부하가 많이 걸린다. 서버의 자원은 한정되어 있기 때문에, 만약 서버의 자원 이상의 요청이 들어온다면, 쓰레드를 생성시키지 못하기 때문에 요청 처리를 하지 못할 것이다.

 

물론 대안은 있겠지..! 뭐 ELB를 써서 분산시킨다던가 하는 말이 있는데 아직 무슨 말인지 잘 모르겠다.. 

 

이런 문제를 극복하기 위해 Node.js는 Event Loop방식의 싱글스레드를 사용하여 요청을 비동기 방식으로 처리한다. Event Loop는 한 번에 단 하나의 작업을 처리하는데, 그 작업이 완료될 때까지(run-to-completion) 기다리지 않고, 바로 다음 작업으로 넘어간다(비동기).

 

Node.js는 다음과 같은 Architecture로 이루어져 있다.

Node.js architecture(직접 만든 그림)

각각의 구조의 기능에 대해 정리해보겠다. 

 

Event Queue : 클라이언트로 부터의 요청을 저장하고, Event loop가 그 요청을 하나씩 검사해서 처리한다. 

 

Event Loop : Event Queue에 있는 요청들을 받아들여 처리하는 역할을 한다. 보통 비동기적인 작업들은 자체적으로 처리하고(6단계 처리), 시간이 오래걸리는 작업(blocking이 될만한 작업)은 Thread pool이라는 thread들로 구성된 곳으로 보내서 처리시킨다. 

 

Thread Pool : Event Loop가 처리하는데 오래걸리는 것들을 받아서, 외부 자원(External resource)들을 이용해 처리한다. 기본적으로 하나의 요청당 하나의 쓰레드를 사용한다. 보통 4개의 쓰레드로 구성되어 있지만, 최대 128개까지 늘릴 수 있다. 처리가 완료되면 Event queue에 알린다.

 

 여기서 짚고 넘어가야 할 점이, Node.js는 Single-Thread 기반의 언어라고 위에서 정리했다. 근데 여기서 갑자기 Thread들을 여러개 이용한다고???  사실, 이 Thread Pool은 Node.js의 기능이 아니다. 이는 libuv라고 하는, Node.js의 작업 처리를 도와주는 Node.js의 라이브러리의 기능이다. 그래서 이 기능은 Node.js의 기능이 아니기 때문에, Node.js는 Event Loop방식의 Single-Thread가 맞다. 

 

External Resource : Thread pool이 시간이 오래 걸리는 작업을 할 때, 이용하는 외부 자원들이다. 

 

간단하게 Flow도 정리해보자. 

 

1. 클라이언트가 요청을 보낸다. 

2. Event queue에 요청이 등록된다. 

3. Event Loop이 Event queue에 있는 요청들을 분류하는데,

  • 보통 비동기적인 요청들은 자체적으로 처리한다. 이때, Event Loop이 요청들을 자체 queue에 넣어서 처리한다기 보다 6단계의 흐름을 거치게 되는데, 각 단계마다 queue가 있어, Event Loop이 각 단계들을 거치며 각각의 단계에 맞는 작업(요청)들을 각각의 queue들에 등록시켜 처리시킨다. 조금 어려운 내용이다. 
  • 시간이 오래걸리는 작업들은 Thread pool이라는 곳으로 보내서 처리시킨다.  

4. 각각의 처리들이 완료되면 클라이언트로 응답을 보낸다. (사실, 이 처리하고 나서 응답을 하는 부분에 대한 자료가 많지 않아서, 어떤 흐름으로 클라이언트로 응답을 보내는지 확실하지 않다)

 

 

자세하게 정리하지 못해 아쉽다. 일단 내가 이해한데로 여기까지 정리하고, 더 공부해서 추가적으로 정리를 해야겠다.

 

참고문서

www.simplilearn.com/understanding-node-js-architecture-article

'기술들 > Today I Learned' 카테고리의 다른 글

Session  (0) 2020.12.16
Cookie  (0) 2020.12.07
CORS 정책 정리  (0) 2020.11.23
HTTP Header 정리 (HTTP/1.1 기준)  (0) 2020.11.22
HTTP 기초 정리  (0) 2020.11.20