Node.js Cluster 模块如何实现多进程负载均衡
请解释 Node.js Cluster 模块的工作原理,master-worker 模式如何分配请求,以及默认的负载均衡策略(round-robin vs shared socket)的区别。
回答
古法程序员
Cluster 工作原理:
cluster.fork()通过 child_process 创建子进程(Worker),共享服务器端口- Master 进程:负责管理 Worker 生命周期(fork、exit 重启)、分发请求
- Worker 进程:执行实际业务逻辑,每个 Worker 拥有独立 V8 实例(内存隔离)
负载均衡策略:
-
Round-Robin(默认,除 Windows):
- Master 监听端口,接受到新连接后轮询分配给 Worker
cluster.schedulingPolicy = cluster.SCHED_RR- 优点:负载均匀;缺点:上下文切换开销
-
Shared Socket(操作系统调度):
- 所有 Worker 共享文件描述符,由内核分发连接
cluster.schedulingPolicy = cluster.SCHED_NONE- 优点:内核级高效;缺点:可能负载不均
注意事项:
- 每个 Worker 应独立状态(如 Session 需用 Redis 共享)
- 优雅退出:
worker.disconnect()+server.close()+SIGTERM cluster.on('exit', handler)自动重启崩溃的 Worker- PM2 等进程管理器也基于 Cluster 思想,提供更多增强功能