Node.js는 단일 스레드로 알려져 있으며 이벤트 루프를 활용하여 비동기 작업을 효율적으로 처리합니다. 그러나 CPU 집약적인 작업을 처리하거나 여러 CPU 코어를 활용하려면 작업자 스레드 및 클러스터링과 같은 고급 접근 방식이 필요합니다. 이 글에서는 이러한 기술에 대해 자세히 알아보고 직접 사용할 수 있는 명확한 설명과 실용 코드 예제를 제공합니다.
1. 개요: 작업자 스레드와 클러스터링을 사용하는 이유는 무엇입니까?
두 기술 모두 확장성과 성능을 다루지만 차이점은 다음과 같습니다.
2. 이벤트 루프와 멀티스레딩의 필요성
Node.js의 이벤트 루프는 단일 스레드입니다. I/O 중심 작업에는 효과적이지만 이미지 처리, 암호화 또는 복잡한 계산과 같은 CPU를 많이 사용하는 작업에는 어려움을 겪습니다. 멀티스레딩이 없으면 이러한 작업은 이벤트 루프를 차단하여 성능에 영향을 미칩니다.
3. Node.js의 작업자 스레드
작업자 스레드를 사용하면 여러 스레드에서 JavaScript 코드를 실행하여 기본 스레드가 차단되는 것을 방지할 수 있습니다.
예: 작업자 스레드를 사용한 이미지 압축
이 예에서는 작업자 스레드를 사용하여 기본 이벤트 루프를 차단하지 않고 이미지를 압축하는 방법을 보여줍니다.
1단계: 이미지 처리를 위해 Sharp를 설치합니다.
npm install sharp
2단계: image-worker.js(작업자 코드)를 생성합니다.
npm install sharp
3단계: Worker_threads의 Worker를 사용하는 메인 스레드
const { parentPort, workerData } = require('worker_threads'); const sharp = require('sharp'); // Compress the image sharp(workerData.inputPath) .resize(800, 600) .toFile(workerData.outputPath) .then(() => parentPort.postMessage('Compression complete')) .catch(err => parentPort.postMessage(`Error: ${err.message}`));
작동 방식
4. Node.js의 클러스터링
클러스터링에는 사용 가능한 모든 CPU 코어를 활용하여 Node.js 프로세스의 여러 인스턴스 생성이 포함됩니다. 이는 트래픽이 많은 웹 서버에서 특히 유용합니다.
예: 클러스터를 사용하는 간단한 HTTP 서버
이 예에서는 클러스터 모듈을 사용하여 확장 가능한 HTTP 서버를 생성하는 방법을 보여줍니다.
const { Worker } = require('worker_threads'); const path = require('path'); function compressImage(inputPath, outputPath) { return new Promise((resolve, reject) => { const worker = new Worker(path.resolve(__dirname, 'image-worker.js'), { workerData: { inputPath, outputPath } }); worker.on('message', message => resolve(message)); worker.on('error', reject); worker.on('exit', code => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); } // Example usage compressImage('input.jpg', 'output.jpg') .then(console.log) .catch(console.error);
작동 방식
5. 작업자 스레드 또는 클러스터 간 통신
근로자 커뮤니케이션(Pub/Sub 패턴)
작업자와 메인 스레드는 메시지 전달을 통해 통신합니다. 이는 Pub/Sub 모델과 유사합니다. 위의 이미지 압축 예에서 작업자 스레드는 parentPort.postMessage()를 사용하여 기본 스레드에 상태 업데이트를 보냅니다.
클러스터나 스레드 간의 고급 통신을 위해 Redis Pub/Sub 또는 메시지 대기열(예: RabbitMQ)을 사용할 수 있습니다.
6. 작업자 스레드와 클러스터링을 언제 사용해야 합니까?
Aspect | Worker Threads | Clustering |
---|---|---|
Use case | CPU-intensive tasks | High-traffic applications |
Execution | Runs within a single process | Spawns multiple processes |
Performance | Avoids blocking the event loop | Utilizes multiple CPU cores |
Communication | Message passing between threads | Message passing between processes |
Fault Tolerance | Limited to process-level recovery | Can restart individual processes |
사용예
7. 작업자 및 클러스터 사용 모범 사례
8. 결론
작업자 스레드와 클러스터링은 모두 Node.js 애플리케이션의 성능 및 확장성을 향상시키는 강력한 도구입니다. 작업자 스레드는 이벤트 루프를 차단하지 않고 CPU 바인딩 작업에 가장 적합한 반면, 클러스터링을 사용하면 여러 CPU 코어에 걸쳐 웹 서버를 수평으로 확장할 수 있습니다.
차이점을 이해하고 사용 사례에 적합한 접근 방식을 선택하면 애플리케이션의 처리량 및 복원력을 크게 향상시킬 수 있습니다.
위 내용은 Node.js 성능 익히기: 작업자 스레드 및 클러스터링의 성능 활용 — Hoai Nho의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!