클러스터
[Stable: 2 - Stable]
Stable: 2 Stability: 2 - Stable
소스 코드: lib/cluster.js
Node.js 프로세스의 클러스터는 애플리케이션 스레드 간에 작업 부하를 분산할 수 있는 여러 Node.js 인스턴스를 실행하는 데 사용할 수 있습니다. 프로세스 격리가 필요하지 않은 경우 단일 Node.js 인스턴스 내에서 여러 애플리케이션 스레드를 실행할 수 있는 worker_threads
모듈을 대신 사용하십시오.
클러스터 모듈을 사용하면 모두 서버 포트를 공유하는 자식 프로세스를 쉽게 생성할 수 있습니다.
import cluster from 'node:cluster'
import http from 'node:http'
import { availableParallelism } from 'node:os'
import process from 'node:process'
const numCPUs = availableParallelism()
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`)
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`)
})
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http
.createServer((req, res) => {
res.writeHead(200)
res.end('hello world\n')
})
.listen(8000)
console.log(`Worker ${process.pid} started`)
}
const cluster = require('node:cluster')
const http = require('node:http')
const numCPUs = require('node:os').availableParallelism()
const process = require('node:process')
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`)
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`)
})
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http
.createServer((req, res) => {
res.writeHead(200)
res.end('hello world\n')
})
.listen(8000)
console.log(`Worker ${process.pid} started`)
}
이제 Node.js를 실행하면 작업자 간에 포트 8000을 공유합니다.
$ node server.js
Primary 3596 is running
Worker 4324 started
Worker 4520 started
Worker 6056 started
Worker 5644 started
Windows에서는 아직 작업자에서 명명된 파이프 서버를 설정할 수 없습니다.
작동 방식
워커 프로세스는 child_process.fork()
메서드를 사용하여 생성되므로 IPC를 통해 부모 프로세스와 통신하고 서버 핸들을 주고받을 수 있습니다.
클러스터 모듈은 들어오는 연결을 분산하는 두 가지 방법을 지원합니다.
첫 번째 방법(Windows를 제외한 모든 플랫폼의 기본값)은 라운드 로빈 방식으로, 주 프로세스가 포트에서 수신 대기하고 새 연결을 수락하여 워커에 라운드 로빈 방식으로 분산합니다. 여기에는 워커 프로세스의 과부하를 방지하기 위한 일부 내장된 기능이 포함되어 있습니다.
두 번째 방법은 주 프로세스가 수신 소켓을 생성하고 관심 있는 워커에게 전송하는 것입니다. 그런 다음 워커는 들어오는 연결을 직접 수락합니다.
이론적으로 두 번째 방법이 최상의 성능을 제공해야 합니다. 그러나 실제로는 운영 체제 스케줄러의 변수로 인해 분산이 매우 불균형적입니다. 총 8개의 프로세스 중 70%가 넘는 연결이 2개의 프로세스에 집중되는 부하가 관찰되었습니다.
server.listen()
이 대부분의 작업을 주 프로세스에 넘기므로 일반 Node.js 프로세스와 클러스터 워커 간의 동작이 다른 세 가지 경우가 있습니다.
Node.js는 라우팅 로직을 제공하지 않습니다. 따라서 세션 및 로그인과 같은 작업에 메모리 내 데이터 객체에 너무 많이 의존하지 않도록 애플리케이션을 설계하는 것이 중요합니다.
워커는 모두 별도의 프로세스이므로 프로그램의 필요에 따라 다른 워커에 영향을 주지 않고도 종료하거나 다시 생성할 수 있습니다. 일부 워커가 계속 작동하는 한 서버는 연결을 계속 수락합니다. 워커가 없으면 기존 연결이 끊어지고 새 연결은 거부됩니다. 그러나 Node.js는 워커 수를 자동으로 관리하지 않습니다. 자체 요구 사항에 따라 워커 풀을 관리하는 것은 애플리케이션의 책임입니다.
node:cluster
모듈의 주요 사용 사례는 네트워킹이지만 워커 프로세스가 필요한 다른 사용 사례에도 사용할 수 있습니다.
클래스: Worker
추가됨: v0.7.0
- 상속: <EventEmitter>
Worker
객체는 워커에 대한 모든 공개 정보와 메서드를 포함합니다. 기본적으로 cluster.workers
를 사용하여 얻을 수 있습니다. 워커에서는 cluster.worker
를 사용하여 얻을 수 있습니다.
이벤트: 'disconnect'
추가됨: v0.7.7
cluster.on('disconnect')
이벤트와 유사하지만 이 워커에 특정합니다.
cluster.fork().on('disconnect', () => {
// 워커 연결이 끊겼습니다
})
이벤트: 'error'
추가됨: v0.7.3
이 이벤트는 child_process.fork()
에서 제공하는 이벤트와 동일합니다.
워커 내부에서는 process.on('error')
를 사용할 수도 있습니다.
이벤트: 'exit'
추가됨: v0.11.2
cluster.on('exit')
이벤트와 유사하지만 이 워커에 특정합니다.
import cluster from 'node:cluster'
if (cluster.isPrimary) {
const worker = cluster.fork()
worker.on('exit', (code, signal) => {
if (signal) {
console.log(`워커가 신호에 의해 종료됨: ${signal}`)
} else if (code !== 0) {
console.log(`워커가 에러 코드와 함께 종료됨: ${code}`)
} else {
console.log('워커 성공!')
}
})
}
const cluster = require('node:cluster')
if (cluster.isPrimary) {
const worker = cluster.fork()
worker.on('exit', (code, signal) => {
if (signal) {
console.log(`워커가 신호에 의해 종료됨: ${signal}`)
} else if (code !== 0) {
console.log(`워커가 에러 코드와 함께 종료됨: ${code}`)
} else {
console.log('워커 성공!')
}
})
}
이벤트: 'listening'
추가됨: v0.7.0
address
<Object>
cluster.on('listening')
이벤트와 유사하지만 이 워커에 특정합니다.
cluster.fork().on('listening', address => {
// 워커가 수신 중입니다
})
cluster.fork().on('listening', address => {
// 워커가 수신 중입니다
})
워커에서는 발생하지 않습니다.
이벤트: 'message'
추가됨: v0.7.0
message
<Object>handle
<undefined> | <Object>
cluster
의 'message'
이벤트와 유사하지만, 이 worker에 특정한 이벤트입니다.
worker 내부에서 process.on('message')
를 사용할 수도 있습니다.
다음은 메시지 시스템을 사용하는 예제입니다. worker가 수신한 HTTP 요청 수를 주 프로세스에서 계산합니다.
import cluster from 'node:cluster'
import http from 'node:http'
import { availableParallelism } from 'node:os'
import process from 'node:process'
if (cluster.isPrimary) {
// HTTP 요청 추적
let numReqs = 0
setInterval(() => {
console.log(`numReqs = ${numReqs}`)
}, 1000)
// 요청 계산
function messageHandler(msg) {
if (msg.cmd && msg.cmd === 'notifyRequest') {
numReqs += 1
}
}
// worker 시작 및 notifyRequest 포함 메시지 수신 대기
const numCPUs = availableParallelism()
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
for (const id in cluster.workers) {
cluster.workers[id].on('message', messageHandler)
}
} else {
// worker 프로세스는 HTTP 서버를 갖습니다.
http
.Server((req, res) => {
res.writeHead(200)
res.end('hello world\n')
// 요청에 대해 주 프로세스에 알림
process.send({ cmd: 'notifyRequest' })
})
.listen(8000)
}
const cluster = require('node:cluster')
const http = require('node:http')
const numCPUs = require('node:os').availableParallelism()
const process = require('node:process')
if (cluster.isPrimary) {
// HTTP 요청 추적
let numReqs = 0
setInterval(() => {
console.log(`numReqs = ${numReqs}`)
}, 1000)
// 요청 계산
function messageHandler(msg) {
if (msg.cmd && msg.cmd === 'notifyRequest') {
numReqs += 1
}
}
// worker 시작 및 notifyRequest 포함 메시지 수신 대기
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
for (const id in cluster.workers) {
cluster.workers[id].on('message', messageHandler)
}
} else {
// worker 프로세스는 HTTP 서버를 갖습니다.
http
.Server((req, res) => {
res.writeHead(200)
res.end('hello world\n')
// 요청에 대해 주 프로세스에 알림
process.send({ cmd: 'notifyRequest' })
})
.listen(8000)
}
이벤트: 'online'
추가됨: v0.7.0
cluster.on('online')
이벤트와 유사하지만, 이 작업자에 특정합니다.
cluster.fork().on('online', () => {
// 작업자가 온라인 상태입니다
})
작업자에서는 발생하지 않습니다.
worker.disconnect()
[히스토리]
버전 | 변경 사항 |
---|---|
v7.3.0 | 이 메서드는 이제 worker 에 대한 참조를 반환합니다. |
v0.7.7 | 추가됨: v0.7.7 |
- 반환값: <cluster.Worker>
worker
에 대한 참조
작업자에서 이 함수는 모든 서버를 닫고 해당 서버의 'close'
이벤트를 기다린 다음 IPC 채널을 연결 해제합니다.
주 프로세스에서 내부 메시지가 작업자에게 전송되어 자체적으로 .disconnect()
를 호출하게 합니다.
.exitedAfterDisconnect
가 설정되도록 합니다.
서버가 닫힌 후에는 더 이상 새 연결을 허용하지 않지만, 다른 수신 중인 작업자에서 연결을 허용할 수 있습니다. 기존 연결은 일반적으로 닫히도록 허용됩니다. 더 이상 연결이 없으면 server.close()
를 참조하고, 작업자에 대한 IPC 채널이 닫혀 작업자가 정상적으로 종료될 수 있습니다.
위 내용은 서버 연결에만 적용되며, 클라이언트 연결은 작업자에 의해 자동으로 닫히지 않으며, disconnect는 종료되기 전에 클라이언트 연결이 닫히기를 기다리지 않습니다.
작업자에서는 process.disconnect
가 있지만, 이 함수가 아닙니다. disconnect()
입니다.
오래 지속되는 서버 연결은 작업자가 연결을 해제하는 것을 차단할 수 있으므로, 메시지를 보내 응용 프로그램별 작업을 수행하여 연결을 닫는 것이 유용할 수 있습니다. 'disconnect'
이벤트가 일정 시간 후에 발생하지 않으면 작업자를 종료하는 시간 제한을 구현하는 것도 유용할 수 있습니다.
if (cluster.isPrimary) {
const worker = cluster.fork()
let timeout
worker.on('listening', address => {
worker.send('shutdown')
worker.disconnect()
timeout = setTimeout(() => {
worker.kill()
}, 2000)
})
worker.on('disconnect', () => {
clearTimeout(timeout)
})
} else if (cluster.isWorker) {
const net = require('node:net')
const server = net.createServer(socket => {
// 연결이 절대 끝나지 않습니다
})
server.listen(8000)
process.on('message', msg => {
if (msg === 'shutdown') {
// 서버에 대한 모든 연결의 정상적인 종료를 시작합니다
}
})
}
worker.exitedAfterDisconnect
추가됨: v6.0.0
이 속성은 worker가 .disconnect()
로 인해 종료된 경우 true
입니다. worker가 다른 방식으로 종료된 경우 false
입니다. worker가 종료되지 않은 경우 undefined
입니다.
부울 값 worker.exitedAfterDisconnect
를 사용하면 자발적 종료와 비자발적 종료를 구분할 수 있으며, 주 프로세스는 이 값을 기반으로 worker를 재생성하지 않도록 선택할 수 있습니다.
cluster.on('exit', (worker, code, signal) => {
if (worker.exitedAfterDisconnect === true) {
console.log('아, 자발적인 종료였군요 – 걱정할 필요 없습니다')
}
})
// worker 종료
worker.kill()
worker.id
추가됨: v0.8.0
각 새로운 worker는 고유한 id를 받으며, 이 id는 id
에 저장됩니다.
worker가 실행 중인 동안, 이것은 cluster.workers
에서 worker의 인덱스 역할을 하는 키입니다.
worker.isConnected()
추가됨: v0.11.14
이 함수는 worker가 IPC 채널을 통해 주 프로세스에 연결되어 있으면 true
를, 그렇지 않으면 false
를 반환합니다. worker는 생성된 후 주 프로세스에 연결됩니다. 'disconnect'
이벤트가 발생한 후 연결이 끊어집니다.
worker.isDead()
추가됨: v0.11.14
이 함수는 worker의 프로세스가 종료되었는지(종료되거나 신호를 받았는지 여부)를 나타내는 부울 값을 반환합니다. 종료되지 않았으면 false
를 반환합니다.
import cluster from 'node:cluster'
import http from 'node:http'
import { availableParallelism } from 'node:os'
import process from 'node:process'
const numCPUs = availableParallelism()
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`)
// Worker 생성
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('fork', worker => {
console.log('worker is dead:', worker.isDead())
})
cluster.on('exit', (worker, code, signal) => {
console.log('worker is dead:', worker.isDead())
})
} else {
// Worker는 모든 TCP 연결을 공유할 수 있습니다. 이 경우 HTTP 서버입니다.
http
.createServer((req, res) => {
res.writeHead(200)
res.end(`Current process\n ${process.pid}`)
process.kill(process.pid)
})
.listen(8000)
}
const cluster = require('node:cluster')
const http = require('node:http')
const numCPUs = require('node:os').availableParallelism()
const process = require('node:process')
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`)
// Worker 생성
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('fork', worker => {
console.log('worker is dead:', worker.isDead())
})
cluster.on('exit', (worker, code, signal) => {
console.log('worker is dead:', worker.isDead())
})
} else {
// Worker는 모든 TCP 연결을 공유할 수 있습니다. 이 경우 HTTP 서버입니다.
http
.createServer((req, res) => {
res.writeHead(200)
res.end(`Current process\n ${process.pid}`)
process.kill(process.pid)
})
.listen(8000)
}
worker.kill([signal])
추가됨: v0.9.12
signal
<string> worker 프로세스에 보낼 kill 신호의 이름. 기본값:'SIGTERM'
이 함수는 worker를 종료합니다. 기본 worker에서는 worker.process
를 연결 해제하고, 연결 해제 후 signal
을 사용하여 종료합니다. worker에서는 signal
을 사용하여 프로세스를 종료합니다.
kill()
함수는 정상적인 연결 해제를 기다리지 않고 worker 프로세스를 종료하며, worker.process.kill()
과 동일한 동작을 합니다.
이 메서드는 이전 버전과의 호환성을 위해 worker.destroy()
로 별칭이 지정되었습니다.
worker에서 process.kill()
은 존재하지만, 이 함수가 아닙니다. kill()
입니다.
worker.process
추가됨: v0.7.0
모든 worker는 child_process.fork()
를 사용하여 생성되며, 이 함수에서 반환된 객체는 .process
로 저장됩니다. worker에서 전역 process
가 저장됩니다.
참조: Child Process 모듈.
process
에서 'disconnect'
이벤트가 발생하고 .exitedAfterDisconnect
가 true
가 아닌 경우 worker는 process.exit(0)
을 호출합니다. 이것은 우발적인 연결 해제로부터 보호합니다.
worker.send(message[, sendHandle[, options]][, callback])
[이력]
버전 | 변경 사항 |
---|---|
v4.0.0 | callback 매개변수가 지원됩니다. |
v0.7.0 | 추가됨: v0.7.0 |
message
<Object>sendHandle
<Handle>options
<Object>options
인수는 존재하는 경우 특정 유형의 핸들을 보내는 매개변수를 지정하는 데 사용되는 객체입니다.options
는 다음 속성을 지원합니다.keepOpen
<boolean>net.Socket
인스턴스를 전달할 때 사용할 수 있는 값입니다.true
이면 소켓은 보내는 프로세스에서 열린 상태로 유지됩니다. 기본값:false
.
callback
<Function>반환값: <boolean>
핸들과 함께 선택적으로 worker 또는 기본 프로세스에 메시지를 보냅니다.
기본 프로세스에서 이것은 특정 worker에 메시지를 보냅니다. ChildProcess.send()
와 동일합니다.
worker에서 이것은 기본 프로세스에 메시지를 보냅니다. process.send()
와 동일합니다.
이 예제는 기본 프로세스의 모든 메시지를 에코합니다.
if (cluster.isPrimary) {
const worker = cluster.fork()
worker.send('hi there')
} else if (cluster.isWorker) {
process.on('message', msg => {
process.send(msg)
})
}
이벤트: 'disconnect'
추가됨: v0.7.9
worker
<cluster.Worker>
워커 IPC 채널이 연결이 끊긴 후 발생합니다. 워커가 정상적으로 종료되거나, 강제 종료되거나, 수동으로 연결이 끊긴 경우(예: worker.disconnect()
사용) 발생할 수 있습니다.
'disconnect'
와 'exit'
이벤트 사이에는 지연이 있을 수 있습니다. 이러한 이벤트는 프로세스가 정리 작업에 멈춰 있거나 장기 실행 연결이 있는지 감지하는 데 사용할 수 있습니다.
cluster.on('disconnect', worker => {
console.log(`워커 #${worker.id} 연결이 끊겼습니다`)
})
이벤트: 'exit'
추가됨: v0.7.9
worker
<cluster.Worker>code
<number> 정상적으로 종료된 경우 종료 코드입니다.signal
<string> 프로세스가 강제 종료된 원인이 된 신호의 이름(예:'SIGHUP'
)입니다.
워커가 종료되면 클러스터 모듈은 'exit'
이벤트를 발생시킵니다.
이는 다시 .fork()
를 호출하여 워커를 다시 시작하는 데 사용할 수 있습니다.
cluster.on('exit', (worker, code, signal) => {
console.log('워커 %d 종료됨 (%s). 다시 시작 중...', worker.process.pid, signal || code)
cluster.fork()
})
child_process
이벤트: 'exit'
참조하십시오.
이벤트: 'fork'
추가됨: v0.7.0
worker
<cluster.Worker>
새로운 워커가 포크되면 클러스터 모듈은 'fork'
이벤트를 발생시킵니다. 이는 워커 활동을 로깅하고 사용자 지정 시간 제한을 만드는 데 사용할 수 있습니다.
const timeouts = []
function errorMsg() {
console.error('연결에 문제가 있는 것 같습니다...')
}
cluster.on('fork', worker => {
timeouts[worker.id] = setTimeout(errorMsg, 2000)
})
cluster.on('listening', (worker, address) => {
clearTimeout(timeouts[worker.id])
})
cluster.on('exit', (worker, code, signal) => {
clearTimeout(timeouts[worker.id])
errorMsg()
})
이벤트: 'listening'
추가됨: v0.7.0
worker
<cluster.Worker>address
<Object>
워커에서 listen()
을 호출한 후 서버에서 'listening'
이벤트가 방출되면, 프라이머리의 cluster
에서도 'listening'
이벤트가 방출됩니다.
이벤트 핸들러는 두 개의 인수로 실행됩니다. worker
는 워커 객체를 포함하고, address
객체는 다음 연결 속성을 포함합니다: address
, port
, addressType
. 워커가 둘 이상의 주소에서 수신 대기하는 경우 매우 유용합니다.
cluster.on('listening', (worker, address) => {
console.log(`워커가 이제 ${address.address}:${address.port}에 연결되었습니다.`)
})
addressType
는 다음 중 하나입니다.
4
(TCPv4)6
(TCPv6)-1
(Unix 도메인 소켓)'udp4'
또는'udp6'
(UDPv4 또는 UDPv6)
이벤트: 'message'
[히스토리]
버전 | 변경 사항 |
---|---|
v6.0.0 | worker 매개변수가 이제 전달됩니다. 자세한 내용은 아래를 참조하십시오. |
v2.5.0 | 추가됨: v2.5.0 |
worker
<cluster.Worker>message
<Object>handle
<undefined> | <Object>
클러스터 프라이머리가 어떤 워커로부터 메시지를 받으면 방출됩니다.
child_process
이벤트: 'message'
참조하십시오.
이벤트: 'online'
추가됨: v0.7.0
worker
<cluster.Worker>
새로운 워커를 포크한 후, 워커는 온라인 메시지로 응답해야 합니다. 프라이머리가 온라인 메시지를 받으면 이 이벤트를 방출합니다. 'fork'
와 'online'
의 차이점은 fork
는 프라이머리가 워커를 포크할 때 방출되고, 'online'
은 워커가 실행 중일 때 방출된다는 것입니다.
cluster.on('online', worker => {
console.log('좋아요, 워커가 포크된 후 응답했습니다.')
})
이벤트: 'setup'
추가됨: v0.7.1
settings
<Object>
.setupPrimary()
가 호출될 때마다 발생합니다.
settings
객체는 .setupPrimary()
가 호출될 당시의 cluster.settings
객체이며, 단일 tick에서 .setupPrimary()
가 여러 번 호출될 수 있으므로 참고용입니다.
정확성이 중요한 경우 cluster.settings
를 사용하십시오.
cluster.disconnect([callback])
추가됨: v0.7.7
callback
<Function> 모든 worker가 연결이 끊기고 핸들이 닫힐 때 호출됩니다.
cluster.workers
의 각 worker에 대해 .disconnect()
를 호출합니다.
worker들의 연결이 끊기면 모든 내부 핸들이 닫히고, 다른 이벤트가 대기 중이지 않으면 primary 프로세스가 정상적으로 종료될 수 있습니다.
이 메서드는 완료 시 호출될 선택적 콜백 인수를 사용합니다.
primary 프로세스에서만 호출할 수 있습니다.
cluster.fork([env])
추가됨: v0.6.0
env
<Object> worker 프로세스 환경에 추가할 키/값 쌍.- 반환값: <cluster.Worker>
새로운 worker 프로세스를 생성합니다.
primary 프로세스에서만 호출할 수 있습니다.
cluster.isMaster
추가됨: v0.8.1
deprecated됨: v16.0.0
[Stable: 0 - Deprecated]
Stable: 0 Stability: 0 - Deprecated
cluster.isPrimary
의 deprecated된 별칭입니다.
cluster.isPrimary
추가됨: v16.0.0
프로세스가 primary인 경우 true
입니다. process.env.NODE_UNIQUE_ID
에 의해 결정됩니다. process.env.NODE_UNIQUE_ID
가 정의되지 않은 경우 isPrimary
는 true
입니다.
cluster.isWorker
추가됨: v0.6.0
프로세스가 기본 프로세스가 아닌 경우( cluster.isPrimary
의 반대) true
입니다.
cluster.schedulingPolicy
추가됨: v0.11.2
스케줄링 정책입니다. 라운드 로빈 방식인 cluster.SCHED_RR
또는 운영 체제에 맡기는 cluster.SCHED_NONE
중 하나입니다. 이는 전역 설정이며, 첫 번째 작업자가 생성되거나 .setupPrimary()
가 호출된 후(어느 것이 먼저이든) 효과적으로 고정됩니다.
SCHED_RR
은 Windows를 제외한 모든 운영 체제에서 기본값입니다. Windows는 libuv가 큰 성능 저하 없이 IOCP 핸들을 효과적으로 분산할 수 있게 되면 SCHED_RR
로 변경됩니다.
cluster.schedulingPolicy
는 NODE_CLUSTER_SCHED_POLICY
환경 변수를 통해서도 설정할 수 있습니다. 유효한 값은 'rr'
및 'none'
입니다.
cluster.settings
[히스토리]
버전 | 변경 사항 |
---|---|
v13.2.0, v12.16.0 | serialization 옵션이 지원됩니다. |
v9.5.0 | cwd 옵션이 지원됩니다. |
v9.4.0 | windowsHide 옵션이 지원됩니다. |
v8.2.0 | inspectPort 옵션이 지원됩니다. |
v6.4.0 | stdio 옵션이 지원됩니다. |
v0.7.1 | 추가됨: v0.7.1 |
- <Object>
execArgv
<string[]> Node.js 실행 파일에 전달되는 문자열 인수 목록입니다. 기본값:process.execArgv
.exec
<string> 작업자 파일의 파일 경로입니다. 기본값:process.argv[1]
.args
<string[]> 작업자에게 전달되는 문자열 인수입니다. 기본값:process.argv.slice(2)
.cwd
<string> 작업자 프로세스의 현재 작업 디렉토리입니다. 기본값:undefined
(상위 프로세스에서 상속).serialization
<string> 프로세스 간 메시지 전송에 사용되는 직렬화 종류를 지정합니다. 가능한 값은'json'
및'advanced'
입니다. 자세한 내용은child_process
에 대한 고급 직렬화를 참조하십시오. 기본값:false
.silent
<boolean> 상위의 stdio로 출력을 보낼지 여부입니다. 기본값:false
.stdio
<Array> 포크된 프로세스의 stdio를 구성합니다. cluster 모듈은 작동하려면 IPC에 의존하므로 이 구성에는'ipc'
항목이 포함되어야 합니다. 이 옵션이 제공되면silent
를 재정의합니다.child_process.spawn()
의stdio
를 참조하십시오.uid
<number> 프로세스의 사용자 ID를 설정합니다. (setuid(2)
참조).gid
<number> 프로세스의 그룹 ID를 설정합니다. (setgid(2)
참조).inspectPort
<number> | <Function> 작업자의 검사기 포트를 설정합니다. 숫자이거나 인수를 사용하지 않고 숫자를 반환하는 함수일 수 있습니다. 기본적으로 각 작업자는 기본의process.debugPort
에서 증가된 자체 포트를 얻습니다.windowsHide
<boolean> 일반적으로 Windows 시스템에서 생성되는 포크된 프로세스 콘솔 창을 숨깁니다. 기본값:false
.
.setupPrimary()
(또는 .fork()
)를 호출한 후 이 설정 개체에는 기본값을 포함한 설정이 포함됩니다.
이 개체는 수동으로 변경하거나 설정하도록 의도되지 않았습니다.
cluster.setupMaster([settings])
[히스토리]
버전 | 변경 사항 |
---|---|
v16.0.0 | v16.0.0부터 더 이상 사용되지 않음 |
v6.4.0 | stdio 옵션 지원 |
v0.7.1 | 추가됨: v0.7.1 |
.setupPrimary()
에 대한 더 이상 사용되지 않는 별칭입니다.
cluster.setupPrimary([settings])
추가됨: v16.0.0
settings
<Object>cluster.settings
참조.
setupPrimary
는 기본 'fork' 동작을 변경하는 데 사용됩니다. 호출되면 설정은 cluster.settings
에 나타납니다.
설정 변경 사항은 .fork()
에 대한 향후 호출에만 영향을 미치며 이미 실행 중인 작업자에는 영향을 미치지 않습니다.
.setupPrimary()
를 통해 설정할 수 없는 작업자의 유일한 속성은 .fork()
에 전달되는 env
입니다.
위의 기본값은 첫 번째 호출에만 적용됩니다. 이후 호출에 대한 기본값은 cluster.setupPrimary()
가 호출될 당시의 현재 값입니다.
import cluster from 'node:cluster'
cluster.setupPrimary({
exec: 'worker.js',
args: ['--use', 'https'],
silent: true,
})
cluster.fork() // https worker
cluster.setupPrimary({
exec: 'worker.js',
args: ['--use', 'http'],
})
cluster.fork() // http worker
const cluster = require('node:cluster')
cluster.setupPrimary({
exec: 'worker.js',
args: ['--use', 'https'],
silent: true,
})
cluster.fork() // https worker
cluster.setupPrimary({
exec: 'worker.js',
args: ['--use', 'http'],
})
cluster.fork() // http worker
이는 주 프로세스에서만 호출할 수 있습니다.
cluster.worker
추가됨: v0.7.0
현재 작업자 객체에 대한 참조입니다. 주 프로세스에서는 사용할 수 없습니다.
import cluster from 'node:cluster'
if (cluster.isPrimary) {
console.log('I am primary')
cluster.fork()
cluster.fork()
} else if (cluster.isWorker) {
console.log(`I am worker #${cluster.worker.id}`)
}
const cluster = require('node:cluster')
if (cluster.isPrimary) {
console.log('I am primary')
cluster.fork()
cluster.fork()
} else if (cluster.isWorker) {
console.log(`I am worker #${cluster.worker.id}`)
}
cluster.workers
추가됨: v0.7.0
id
필드를 키로 하여 활성화된 worker 객체를 저장하는 해시입니다. 이를 통해 모든 worker를 쉽게 순회할 수 있습니다. 주 프로세스에서만 사용 가능합니다.
worker는 worker가 연결이 끊긴 후 그리고 종료된 후에 cluster.workers
에서 제거됩니다. 이 두 이벤트의 순서는 미리 알 수 없습니다. 그러나 cluster.workers
목록에서 제거되는 것은 마지막 'disconnect'
또는 'exit'
이벤트가 방출되기 전에 발생한다는 것이 보장됩니다.
import cluster from 'node:cluster'
for (const worker of Object.values(cluster.workers)) {
worker.send('big announcement to all workers')
}
const cluster = require('node:cluster')
for (const worker of Object.values(cluster.workers)) {
worker.send('big announcement to all workers')
}