cluster 模块
cluster
属性
- cluster.isPrimary: 是否为主线程;
- cluster.workers: 当前所有的 worker, 主进程可用;
- cluster.isWorker: 是否为子线程;
- cluster.worker: 当前 worker, 子进程可用;
事件
- disconnect: 与 worker IPC 断开连接;
- fork: 新 worker 建立;
- exit: 任一 worker 退出进程;
- error: 当前 worker 报错;
- listening: 调用 listen() 触发;
- message: 接受子进程消息触发;
- online: 新 worker 运行触发;
方法
- cluster.disconnect([callback]): 关闭所有的 worker;
- cluster.fork([env]): 创建 worker;
worker 对象
基础
- cluster.fork() 返回值;
属性
- id: worker 编号;
- process: worker 对应 process 对象;
事件
- cluster 对应事件的当前 worker 版本;
- disconnect;
- error;
- exit;
- listening;
- message;
- online;
方法
- worker.send(): 用于主进程中, 向对应当前 worker 发送消息, 触发子进程 message 事件;
- worker.disconnect(): 用于主进程中, 关闭当前 worker;
- worker.isConnected(): 用于主进程中, 当前 worker 是否存在 IPC;
- worker.isDead(): 用于主进程中, 当前 worker 是否终止;
- worker.kill([signal]): 用于主进程中, 立刻终止当前 worker;
最佳实践
守护进程
- 自带负载均衡器, 使用 Round-robin 算法;
- 使用 isPrimary 判断是否为主进程;
- 通过监听 exit 事件实现进程守护;
- 子进程失效, 立刻 fork()
import cluster from "cluster";
import http from "http";
import { availableParallelism } from "os";
import process from "node:process";
const numCPUs = availableParallelism();
if (cluster.isPrimary) {
console.log(`Primary ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on("exit", (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
cluster.fork();
});
} else {
http
.createServer((req, res) => {
res.writeHead(200);
res.end("hello world\n");
})
.listen(8000);
console.log(`Worker ${process.pid} started`);
}