Node.js使用cluster模块按CPU核数创建Worker是否需额外负载均衡
关于Node.js cluster模块负载均衡能力的解答
你当前的实现已经可以满足绝大多数单节点部署场景的需求,不需要额外引入负载均衡组件,仅在特定场景下需要叠加其他负载均衡组件。
现有实现的可用性说明
Node.js的cluster模块原生自带负载均衡调度能力,非Windows平台默认采用轮询策略,Windows平台采用IOCP调度策略,主进程会自动将收到的请求均匀分发到各个Worker进程。你按照CPU核心数创建Worker的逻辑刚好可以充分利用多核CPU的性能,规避Node.js单线程的性能瓶颈,同时你已经实现了Worker异常退出后自动重启的逻辑,单节点下的负载均衡能力和可用性已经达标。
你提交的实现代码如下:
const express = require("express"); const cluster = require("cluster"); const totalCPUs = require("os").cpus().length; const PORT = process.env.PORT || 3000; if (cluster.isMaster) { console.log(`Number of CPUs is ${totalCPUs}`); // Fork workers. for (let i = 0; i < totalCPUs; i++) { cluster.fork(); } cluster.on("exit", (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); console.log("Let's fork another worker!"); cluster.fork(); }); } else { const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: false })); // Route Calling const vehicleRoute = require("./routes/vehicle"); app.use("/api", vehicleRoute); app.listen(PORT, () => { console.log(`[${process.pid}]App listening on port ${PORT}`); }); }
需要额外引入负载均衡组件的场景
- 多节点集群部署:cluster模块仅能管理单台服务器上的进程,如果你需要部署多台应用服务器做水平扩容,需要在集群前置Nginx、HAProxy等负载均衡组件,将流量分发到不同的服务器节点
- 需要额外流量管理能力:如果你需要实现HTTPS卸载、静态资源缓存、请求限流、WAF防护、会话保持、灰度流量切分等功能,cluster模块本身不支持这类能力,前置负载均衡组件可以快速实现相关需求
- 特殊调度策略需求:cluster默认的调度策略如果满足不了业务需求,比如需要按IP哈希保证同一个用户的请求始终落到同一个Worker、按权重分配流量等场景,可以使用额外的负载均衡组件实现自定义调度
- 超高并发场景:当单节点QPS极高时,cluster主进程的请求分发逻辑可能会成为性能瓶颈,前置反向代理负载均衡组件可以分担分发压力,提升整体吞吐能力
优化建议
如果当前业务为单节点部署、流量规模不大,现有代码完全可以正常运行,不需要做额外改造;后续业务规模上涨后,再按需叠加Nginx等负载均衡组件、扩展多节点部署即可。
内容的提问来源于stack exchange,提问作者Smit Gajera
相关产品推荐
相关产品推荐

