Skip to content

클러스터

[Stable: 2 - Stable]

Stable: 2 Stability: 2 - Stable

소스 코드: lib/cluster.js

Node.js 프로세스의 클러스터는 애플리케이션 스레드 간에 작업 부하를 분산할 수 있는 여러 Node.js 인스턴스를 실행하는 데 사용할 수 있습니다. 프로세스 격리가 필요하지 않은 경우 단일 Node.js 인스턴스 내에서 여러 애플리케이션 스레드를 실행할 수 있는 worker_threads 모듈을 대신 사용하십시오.

클러스터 모듈을 사용하면 모두 서버 포트를 공유하는 자식 프로세스를 쉽게 생성할 수 있습니다.

js
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`)
}
js
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을 공유합니다.

bash
$ 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

Worker 객체는 워커에 대한 모든 공개 정보와 메서드를 포함합니다. 기본적으로 cluster.workers를 사용하여 얻을 수 있습니다. 워커에서는 cluster.worker를 사용하여 얻을 수 있습니다.

이벤트: 'disconnect'

추가됨: v0.7.7

cluster.on('disconnect') 이벤트와 유사하지만 이 워커에 특정합니다.

js
cluster.fork().on('disconnect', () => {
  // 워커 연결이 끊겼습니다
})

이벤트: 'error'

추가됨: v0.7.3

이 이벤트는 child_process.fork()에서 제공하는 이벤트와 동일합니다.

워커 내부에서는 process.on('error')를 사용할 수도 있습니다.

이벤트: 'exit'

추가됨: v0.11.2

  • code <number> 정상적으로 종료된 경우 종료 코드입니다.
  • signal <string> 프로세스가 종료되도록 한 신호의 이름(예: 'SIGHUP')입니다.

cluster.on('exit') 이벤트와 유사하지만 이 워커에 특정합니다.

js
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('워커 성공!')
    }
  })
}
js
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

cluster.on('listening') 이벤트와 유사하지만 이 워커에 특정합니다.

js
cluster.fork().on('listening', address => {
  // 워커가 수신 중입니다
})
js
cluster.fork().on('listening', address => {
  // 워커가 수신 중입니다
})

워커에서는 발생하지 않습니다.

이벤트: 'message'

추가됨: v0.7.0

cluster'message' 이벤트와 유사하지만, 이 worker에 특정한 이벤트입니다.

worker 내부에서 process.on('message')를 사용할 수도 있습니다.

process 이벤트: 'message' 참조

다음은 메시지 시스템을 사용하는 예제입니다. worker가 수신한 HTTP 요청 수를 주 프로세스에서 계산합니다.

js
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)
}
js
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') 이벤트와 유사하지만, 이 작업자에 특정합니다.

js
cluster.fork().on('online', () => {
  // 작업자가 온라인 상태입니다
})

작업자에서는 발생하지 않습니다.

worker.disconnect()

[히스토리]

버전변경 사항
v7.3.0이 메서드는 이제 worker에 대한 참조를 반환합니다.
v0.7.7추가됨: v0.7.7

작업자에서 이 함수는 모든 서버를 닫고 해당 서버의 'close' 이벤트를 기다린 다음 IPC 채널을 연결 해제합니다.

주 프로세스에서 내부 메시지가 작업자에게 전송되어 자체적으로 .disconnect()를 호출하게 합니다.

.exitedAfterDisconnect가 설정되도록 합니다.

서버가 닫힌 후에는 더 이상 새 연결을 허용하지 않지만, 다른 수신 중인 작업자에서 연결을 허용할 수 있습니다. 기존 연결은 일반적으로 닫히도록 허용됩니다. 더 이상 연결이 없으면 server.close()를 참조하고, 작업자에 대한 IPC 채널이 닫혀 작업자가 정상적으로 종료될 수 있습니다.

위 내용은 서버 연결에만 적용되며, 클라이언트 연결은 작업자에 의해 자동으로 닫히지 않으며, disconnect는 종료되기 전에 클라이언트 연결이 닫히기를 기다리지 않습니다.

작업자에서는 process.disconnect가 있지만, 이 함수가 아닙니다. disconnect()입니다.

오래 지속되는 서버 연결은 작업자가 연결을 해제하는 것을 차단할 수 있으므로, 메시지를 보내 응용 프로그램별 작업을 수행하여 연결을 닫는 것이 유용할 수 있습니다. 'disconnect' 이벤트가 일정 시간 후에 발생하지 않으면 작업자를 종료하는 시간 제한을 구현하는 것도 유용할 수 있습니다.

js
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를 재생성하지 않도록 선택할 수 있습니다.

js
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를 반환합니다.

js
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)
}
js
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' 이벤트가 발생하고 .exitedAfterDisconnecttrue가 아닌 경우 worker는 process.exit(0)을 호출합니다. 이것은 우발적인 연결 해제로부터 보호합니다.

worker.send(message[, sendHandle[, options]][, callback])

[이력]

버전변경 사항
v4.0.0callback 매개변수가 지원됩니다.
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()와 동일합니다.

이 예제는 기본 프로세스의 모든 메시지를 에코합니다.

js
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

워커 IPC 채널이 연결이 끊긴 후 발생합니다. 워커가 정상적으로 종료되거나, 강제 종료되거나, 수동으로 연결이 끊긴 경우(예: worker.disconnect() 사용) 발생할 수 있습니다.

'disconnect''exit' 이벤트 사이에는 지연이 있을 수 있습니다. 이러한 이벤트는 프로세스가 정리 작업에 멈춰 있거나 장기 실행 연결이 있는지 감지하는 데 사용할 수 있습니다.

js
cluster.on('disconnect', worker => {
  console.log(`워커 #${worker.id} 연결이 끊겼습니다`)
})

이벤트: 'exit'

추가됨: v0.7.9

  • worker <cluster.Worker>
  • code <number> 정상적으로 종료된 경우 종료 코드입니다.
  • signal <string> 프로세스가 강제 종료된 원인이 된 신호의 이름(예: 'SIGHUP')입니다.

워커가 종료되면 클러스터 모듈은 'exit' 이벤트를 발생시킵니다.

이는 다시 .fork()를 호출하여 워커를 다시 시작하는 데 사용할 수 있습니다.

js
cluster.on('exit', (worker, code, signal) => {
  console.log('워커 %d 종료됨 (%s). 다시 시작 중...', worker.process.pid, signal || code)
  cluster.fork()
})

child_process 이벤트: 'exit' 참조하십시오.

이벤트: 'fork'

추가됨: v0.7.0

새로운 워커가 포크되면 클러스터 모듈은 'fork' 이벤트를 발생시킵니다. 이는 워커 활동을 로깅하고 사용자 지정 시간 제한을 만드는 데 사용할 수 있습니다.

js
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

워커에서 listen()을 호출한 후 서버에서 'listening' 이벤트가 방출되면, 프라이머리의 cluster에서도 'listening' 이벤트가 방출됩니다.

이벤트 핸들러는 두 개의 인수로 실행됩니다. worker는 워커 객체를 포함하고, address 객체는 다음 연결 속성을 포함합니다: address, port, addressType. 워커가 둘 이상의 주소에서 수신 대기하는 경우 매우 유용합니다.

js
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.0worker 매개변수가 이제 전달됩니다. 자세한 내용은 아래를 참조하십시오.
v2.5.0추가됨: v2.5.0

클러스터 프라이머리가 어떤 워커로부터 메시지를 받으면 방출됩니다.

child_process 이벤트: 'message' 참조하십시오.

이벤트: 'online'

추가됨: v0.7.0

새로운 워커를 포크한 후, 워커는 온라인 메시지로 응답해야 합니다. 프라이머리가 온라인 메시지를 받으면 이 이벤트를 방출합니다. 'fork''online'의 차이점은 fork는 프라이머리가 워커를 포크할 때 방출되고, 'online'은 워커가 실행 중일 때 방출된다는 것입니다.

js
cluster.on('online', worker => {
  console.log('좋아요, 워커가 포크된 후 응답했습니다.')
})

이벤트: 'setup'

추가됨: v0.7.1

.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

새로운 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가 정의되지 않은 경우 isPrimarytrue입니다.

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.schedulingPolicyNODE_CLUSTER_SCHED_POLICY 환경 변수를 통해서도 설정할 수 있습니다. 유효한 값은 'rr''none'입니다.

cluster.settings

[히스토리]

버전변경 사항
v13.2.0, v12.16.0serialization 옵션이 지원됩니다.
v9.5.0cwd 옵션이 지원됩니다.
v9.4.0windowsHide 옵션이 지원됩니다.
v8.2.0inspectPort 옵션이 지원됩니다.
v6.4.0stdio 옵션이 지원됩니다.
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.0v16.0.0부터 더 이상 사용되지 않음
v6.4.0stdio 옵션 지원
v0.7.1추가됨: v0.7.1

[안정성: 0 - 더 이상 사용되지 않음]

안정성: 0 안정성: 0 - 더 이상 사용되지 않음

.setupPrimary()에 대한 더 이상 사용되지 않는 별칭입니다.

cluster.setupPrimary([settings])

추가됨: v16.0.0

setupPrimary는 기본 'fork' 동작을 변경하는 데 사용됩니다. 호출되면 설정은 cluster.settings에 나타납니다.

설정 변경 사항은 .fork()에 대한 향후 호출에만 영향을 미치며 이미 실행 중인 작업자에는 영향을 미치지 않습니다.

.setupPrimary()를 통해 설정할 수 없는 작업자의 유일한 속성은 .fork()에 전달되는 env입니다.

위의 기본값은 첫 번째 호출에만 적용됩니다. 이후 호출에 대한 기본값은 cluster.setupPrimary()가 호출될 당시의 현재 값입니다.

js
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
js
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

현재 작업자 객체에 대한 참조입니다. 주 프로세스에서는 사용할 수 없습니다.

js
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}`)
}
js
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' 이벤트가 방출되기 전에 발생한다는 것이 보장됩니다.

js
import cluster from 'node:cluster'

for (const worker of Object.values(cluster.workers)) {
  worker.send('big announcement to all workers')
}
js
const cluster = require('node:cluster')

for (const worker of Object.values(cluster.workers)) {
  worker.send('big announcement to all workers')
}