NodeJS가 여러 요청을 처리하는 방법
NodeJS는 하나의 JavaScript 스레드만 사용한다.
문제점
각 요청마다 스레드를 지정할 수 없기 때문에, 결국 모두 하나의 스레드에서 실행될 것이다.
이에 따라 보안 상의 문제가 제기될 것이다.
그렇다면, 만약 요청 A를 아직 처리 중이라면, 요청 B는 처리할 수 없는 것일까 ?
➡️ 그렇지 않다 ! 둘 다 처리할 수 있다 !
어떻게 둘 다 처리할 수 있을까 ?
1. fs(파일 시스템)에 접근할 수 있는 코드들을 사용할 수 있다.
하지만, 파일을 다루는 작업은 오래 걸릴 수 있다.
이에 따라, 들어온 요청을 다루고 있을 때, 새로 들어온 요청은 기다리거나, 거부될 수 있다.
2. 이벤트 루프를 이용한다.
이벤트 루프는 Node.js가 시작하면 프로그램에 의해 자동으로 시작된다.
이벤트 루프는 이벤트 콜백(createServer, ...)을 다루는데, 특정 이벤트가 일어났을 때 바로 이벤트 루프가 해당 코드를 실행한다.
하지만, 시간이 오래 걸리는 파일 연산에는 도움이 되지 않는다.
이벤트 루프는 오직 완성된 작성된 파일에 정의한 콜백에 대한 코드들만 처리한다.
즉, 이벤트 루프는 빨리 끝낼 수 있는 코드를 포함한 콜백만을 다룬다.
대신 파일 시스템 연산 등의 오래 걸리는 연산은 워커풀(Worker Pool)에 보내진다.
워커풀이란 ?
워커풀은 Node.js가 자동으로 시작하고 관리한다.
무거운 작업을 담당하는 워커풀은 JavaScript 코드로부터 완전히 분리되어 다른 여러 스레드에서 작동할 수 있다.
또한, 앱을 실행하는 운영 체제와 깊은 연관이 있다.
코드로부터 분리되었기 때문에 무거운 작업을 모두 처리할 수 있다.
파일과 관련된 작업을 할 때는 워커풀의 워커(Worker)가 코드, 요청 및 이벤트 루프와 분리된 상태에서 작업을 수행한다.
하지만, 워커풀과 이벤트 루프와는 한 가지 연결점이 있다.
워커가 작업(파일 읽기 등)을 마치면 읽기 파일 연산에 대한 콜백이 시작되는데 이벤트 루프가 이벤트와 콜백을 책임지기 때문에 결국 이벤트 루프에 들어가게 된고, 이곳에서 Node.js가 알맞은 콜백을 실행한다.
이벤트 루프
Node.js에 의해 실행되어 Node.js를 계속 실행하도록 하는 루프로 모든 콜백을 처리한다.
이 때, 콜백을 처리하는 데에는 일정한 순서가 있다.
순서
1. 실행해야 하는 타이머 콜백이 있는지 확인한다.
setTimeout()과, setInterval()이라는 메서드가 있다.
타이머를 설정했을 때, 타이머가 끝나면 실행할 함수를 Node.js가 알고 있기 때문에 항상 새로운 루프 반복이 일어날 때마다 시간이 다 된 콜백을 실행한다.
2. 다른 콜백을 체크한다.
입력 및 출력(I/O)과 같은 연산이 끝나고 난 뒤, 콜백이 있을 수 있는데, 이러한 콜백을 실행한다.
여기서의 I/O는 일반적으로 파일 연산이지만, 네트워크 연산인 경우도 있다. 보통 오래 걸리는 블로킹 연산을 가리킨다.
이 때 만약, 아직 처리되지 않은 콜백이 너무 많이 있다면 루프 반복을 이어가는 대신 남은 콜백을 다음 반복에서 실행하도록 미룬다
이후, 열린 콜백을 모두 처리하고 나면 Poll 단계에 진입하게 된다.
'NodeJS' 카테고리의 다른 글
이벤트 기반 코드 이해 & 블로킹, 논블로킹 코드 (0) | 2024.04.10 |
---|---|
라우터 요청 & 요청 리디렉션 & 분석(데이터 스트림, 버퍼) (0) | 2024.04.05 |
응답 전송 (0) | 2024.03.26 |
Node 서버 생성과 라이프사이클 및 이벤트 루프 (0) | 2024.03.26 |
웹 작동 방식 (0) | 2024.03.25 |