Node.js는 기본적으로 싱글스레드다.
Node.js를 구성하는 libuv라이브러리가 스레드 풀을 제공하는 것처럼 보이지만, 실제로 사용하는 애플리케이션은 한 개다.worker_threads 등장 (https://nodejs.org/api/worker_threads.html)
Node.js는 CPU intensive한 작업에 취약하다
i/o intensive한 서비스에 적절한 한편, cpu intensive한 작업에 취약하다. 예를 들면,
- 피보나치수열과 같은 복잡한 연산
- for(let i = 0; i <1000000000; i++;)와 같이 큰 수로 반복문을 도는 코드
- 암호화
- 영상 인코딩
등과 같은 작업을 싱글스레드가 붙잡고 있는 동안 다른 요청을 처리할 수 없기 때문이다.
노드가 빠른 이유, Non-blocking I/O
non-blockin I/O를 설명하기 위해 Node.js를 학급 일진에 비유하자면, 노드는 빵이 먹고 싶을 때 직접 빵을 사 오지 않고 친구를 매점(데이터베이스)으로 보내 빵을 사오거나, 재고를 파악해오는 등의 심부름을 시킨다. 빵 100개가 먹고 싶으면 친구 100명에게 각각 심부름을 시키고 먼저 도착하는 순서대로 처리한다. 친구가 심부름을 하는 사이 노드는 화장실도 다녀오고 카톡도 보낼 수 있다. (친구가 빵을 사오는 사이 다른작업을 한다는게 멀티스레드 처럼 느껴질 수 있다. 그러나 노드는 심부름을 보내는 행위까지만 했고 빵을 사오는 주체는 노드가 아니다.)
노드는 싱글 스레드이다. 따라서 화장실을 가는 도중에 카톡을 보내는 등의 멀티태스킹 행위는 할 수 없지만, 구글에서 개발한 v8엔진 덕분에 화장실 다녀오는 행위도, 메시지를 전송하는 행위도 상당히 빠르다.
다만 노드에게도 약점이 있다. 처리가 오래 걸리는 복잡한 수학 연산이나 암호화, 영상 인코딩과 같이 CPU intensive한 작업을 노드 본인이 직접 수행할 경우, 멀티태스킹이 불가하기 때문에 심부름을 시키는 간단한 행위조차 할 수 없게된다.
node.js가 효과적인 케이스
- 웹서버 : 리퀘스트 병목이 발생해도 비동기 처리가 가능하기 때문에 효과적이다.
- 실시간 서버 : 소켓 통신과 궁합이 좋다. 소켓 이벤트가 있을때만 스레드로 처리하기 때문
참조 : https://www.youtube.com/watch?v=UCd6LorxpkY
참조 : https://yceffort.kr/2021/04/nodejs-multithreading-worker-threads
Home
yceffort
yceffort.kr
'항해99' 카테고리의 다른 글
운영체제 1차시 (0) | 2022.02.20 |
---|---|
깊은 복사와 얕은 복사 (1) | 2022.02.20 |
프로세스와 스레드 (2) | 2022.02.19 |
가비지 컬렉션 - 마크앤 스윕 (0) | 2022.02.13 |
가비지 컬렉션 - 레퍼런스 카운팅 (0) | 2022.02.13 |