자바스크립트 노드 프로세스 관리: 이젠 쉽게 할 수 있다
들어가며
노드(Node.js)는 자바스크립트로 서버를 구축할 수 있는 런타임입니다. 노드 서버를 운영할 때 여러 프로세스가 동시에 실행되고 있는데, 이를 관리하는 것은 중요한 문제입니다. 이번 글에서는 자바스크립트 노드 프로세스 관리에 대해 알아보겠습니다.
프로세스 생성
먼저, 프로세스를 생성하는 방법부터 알아봅시다. 다음 코드는 `child_process` 모듈을 사용하여 프로세스를 생성하는 예시입니다.
const { spawn } = require('child_process');
const child = spawn('ls', ['-la']);
child.stdout.on('data', (data) => {
console.log(`표준 출력: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`표준 에러: ${data}`);
});
child.on('close', (code) => {
console.log(`프로세스 종료, 종료 코드 ${code}`);
});
위 코드는 `ls -la` 명령어를 실행하여 결과를 출력하는 코드입니다. `spawn` 함수를 호출하면 새로운 프로세스가 만들어지고, 첫 번째 인자로는 실행할 명령어를, 두 번째 인자로는 명령어에 전달할 옵션들을 배열로 전달합니다. `stdout`, `stderr`, `close` 이벤트 리스너를 붙여 해당 이벤트가 발생할 때마다 출력을 처리합니다.
프로세스 간 통신
생성된 프로세스들이 서로 통신할 수 있도록 해줄 필요가 있습니다. 이를 위해 `child_process` 모듈에서 제공하는 `spawn` 함수 대신 `fork` 함수를 사용합니다. `fork` 함수를 사용하면 새로운 노드 프로세스를 생성하고, 부모 프로세스와 통신할 수 있도록 IPC(Inter-Process Communication) 채널을 생성합니다.
다음은 `fork` 함수를 사용한 예시 코드입니다.
// 부모 프로세스
const { fork } = require('child_process');
const child = fork('./child.js');
child.on('message', (message) => {
console.log(`부모 프로세스에서 받은 메시지: ${message}`);
});
child.send('부모 프로세스에서 보내는 메시지'); // 메시지 보내기
// 자식 프로세스 (child.js)
process.on('message', (message) => {
console.log(`자식 프로세스에서 받은 메시지: ${message}`);
process.send('자식 프로세스에서 보내는 메시지'); // 메시지 보내기
});
위 예시에서 `fork(‘./child.js’)`는 `child.js`을 실행하여 새로운 프로세스를 만듭니다. 부모와 자식 프로세스 간의 통신은 `on(‘message’)` 함수와 `send()` 함수를 이용하여 이루어집니다.
프로세스간 클러스터링
노드 서버에서는 여러 클라이언트의 요청을 처리해야 하기 때문에, 하나의 프로세스만으로는 부족합니다. 이를 해결하기 위해 노드에서는 클러스터(Cluster)라는 개념을 도입하였습니다.
다음은 클러스터링을 구현한 예시 코드입니다.
// 서버 프로세스
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) { // 마스터 프로세스
console.log(`마스터 프로세스 ${process.pid}가 실행됩니다.`);
for (let i = 0; i < numCPUs; i++) { // 워커 프로세스 생성
cluster.fork();
}
} else { // 워커 프로세스
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello, World!\n');
}).listen(8000);
console.log(`워커 프로세스 ${process.pid}가 실행됩니다.`);
}
위 코드에서 `os` 모듈을 사용하여 시스템의 CPU 코어 개수를 구하고, 해당 개수만큼 `cluster.fork()` 함수를 호출하여 워커 프로세스를 생성합니다. 마스터 프로세스는 클러스터링된 워커 프로세스들을 관리하고, 워커 프로세스들은 실질적인 작업을 수행합니다.
자바스크립트 노드 프로세스 관리
자바스크립트 노드 프로세스 관리는 서버 운영에 있어서 중요한 문제입니다. `child_process` 모듈을 이용해 프로세스를 생성하고, `fork` 함수를 이용해 프로세스 간 통신을 할 수 있게 되면 보다 안정적인 노드 서버를 구축할 수 있습니다. 또한 클러스터링을 통해 워커 프로세스를 생성하면 서버 부하를 분산시키고, 더 많은 클라이언트 요청을 처리할 수 있게 됩니다.
(최종 글자 수: 903자)
**자바스크립트 노드 프로세스 관리**