Node.js는 오늘날 가장 인기 있는 기술 중 하나입니다. 이번 글에서는 Node.js의 특징과 활용 시나리오를 주로 소개합니다.
Node.js는 빠르고 쉽게 확장 가능한 웹 애플리케이션을 쉽게 구축할 수 있도록 Chrome JavaScript 런타임을 기반으로 구축된 플랫폼입니다. Node.js는 이벤트 중심의 비차단 I/O 모델을 사용하여 가볍고 효율적이며 분산 장치에서 실행되는 데이터 집약적인 실시간 애플리케이션에 매우 적합합니다.
1. 특징
1.1 비동기 I/O
소위 비동기 I/O는 동기 I/O와 관련이 있습니다. 프로그램 실행 중에는 파일 읽기 및 쓰기, 입력 및 출력, 요청 응답 등 많은 I/O 작업이 수행되어야 합니다. 일반적으로 I/O 작업은 시간이 많이 걸립니다. 예를 들어, 기존 프로그래밍 모델에서는 수 기가바이트의 파일을 읽으려는 경우 전체 스레드가 일시 중지되고 계속하기 전에 파일을 읽을 때까지 기다립니다. 즉, I/O 작업은 코드 실행을 차단하고 프로그램 효율성을 크게 저하시킵니다.
비동기 I/O와 관련하여 Ajax 요청을 시작하는 것이 가장 일반적인 "비동기" 호출이기 때문에 실제로 프런트엔드 엔지니어에게는 낯설지 않습니다. Node에서 파일 읽기(파일 읽기는 시간이 많이 걸리는 I/O 작업)를 예로 들면 Ajax 요청을 시작하는 방법과 매우 유사합니다.
위 코드가 fs.readFile을 호출한 후 바로 다음 코드가 실행되는데, "파일 읽기가 완료"되는 순간은 예측할 수 없습니다. 스레드가 I/O 작업을 만나면 차단 방식으로 I/O 작업이 끝날 때까지 기다리지 않고 운영 체제에 I/O 요청을 보내고 후속 명령문을 계속 실행합니다. 운영체제는 I/O 작업이 완료되면 I/O 작업을 수행하는 스레드에게 이벤트 형태로 이를 알리고, 스레드는 특정 시간에 해당 이벤트를 처리하게 된다.
1.2 이벤트 루프 및 콜백 함수
소위 이벤트 루프는 Node가 이벤트 메커니즘을 사용하여 모든 비동기 작업을 해결한다는 의미이며, 이벤트 큐를 지속적으로 확인하는 스레드가 있습니다. 이벤트 루프는 프로그램이 끝날 때까지 이벤트 큐에서 처리되지 않은 이벤트를 확인합니다. 이벤트 프로그래밍 방법은 가볍고, 느슨하게 결합되며, 트랜잭션 지점에만 집중한다는 장점이 있습니다. 그러나 여러 비동기 작업의 시나리오에서는 이벤트가 서로 독립적이며 어떻게 협업할지가 문제입니다. Javascript에는 콜백 함수가 어디에나 있으며 콜백 함수는 비동기 호출에서 반환된 데이터를 수신하는 가장 좋은 방법입니다.
1.3 단일 스레드
Node는 브라우저에서 JS의 단일 스레드 특성을 유지합니다. 단일 스레딩의 가장 큰 장점은 다중 스레드 프로그래밍과 같은 상태 동기화 문제를 걱정할 필요가 없으며 스레드 컨텍스트 전환에 따른 오버헤드가 없다는 것입니다. 단일 스레딩에는 주로 세 가지 측면에서 약점이 있습니다. 오류로 인해 전체 응용 프로그램이 종료되고 응용 프로그램의 견고성이 CPU를 많이 차지한다는 점입니다. 비동기 I/O를 계속 호출할 수 없게 만듭니다.
위 문제를 해결하기 위해 Node에서는 HTML5 Web Workers와 동일한 아이디어를 채택하여 child_process를 사용하여 단일 스레드에서 계산량이 많은 문제를 해결합니다. 계산을 다양한 하위 프로세스에 분산시킨 후 프로세스 간 이벤트 메시지를 통해 결과를 전달함으로써 많은 수의 계산을 분할할 수 있습니다.
1.4 크로스 플랫폼
노드는 크로스 플랫폼입니다. 즉, 동일한 JS 코드 세트를 Windows, Linux, OSX 및 기타 플랫폼에서 배포하고 실행할 수 있습니다. 이는 주로 Node가 운영 체제와 Node의 상위 모듈 시스템 사이에 플랫폼 계층 아키텍처 libuv를 구축하기 때문입니다.
2. 적용 시나리오
1) 실시간 애플리케이션: 온라인 채팅, 실시간 알림 푸시 등 (예: socket.io)
2) 분산 애플리케이션: 효율적인 병렬 I/O를 통해 기존 데이터를 활용합니다
3) 도구 애플리케이션: 프런트 엔드 압축 배포(예: grunt)부터 대규모 데스크톱 그래픽 인터페이스 애플리케이션
에 이르기까지 다양한 도구
4) 게임 애플리케이션: 게임 분야는 실시간 및 동시성에 대한 요구 사항이 높습니다(예: NetEase의 pomelo 프레임워크)
5) 안정적인 인터페이스를 사용하여 웹 렌더링 기능을 향상합니다
6) 통합된 프런트엔드 및 백엔드 프로그래밍 언어 환경: 프런트엔드 개발자는 서버측 개발로 빠르게 전환할 수 있습니다(예: 유명한 순수 Javascript 풀 스택 MEAN 아키텍처)