CommonJS 模块系统在 Node.js Cluster 多进程模式下要求主进程仅管理派生、不加载业务逻辑;所有 HTTP 服务、中间件、数据库连接等必须由各 worker 进程独立 require 并初始化,确保作用域与状态隔离。

CommonJS 是 Node.js 默认的模块系统,每个文件都是独立模块,通过 require() 加载依赖、module.exports 导出接口。配合 cluster 实现多进程服务时,关键在于:**主进程不加载业务逻辑,只负责派生;所有实际 HTTP 服务和中间件逻辑都由子进程各自通过 CommonJS 加载并运行**——这样每个 worker 都拥有完整、隔离的模块作用域和运行时环境。
子进程独立加载服务代码
Cluster 模式下,主进程(isPrimary 或 isMaster)仅做进程管理,不执行业务代码。真正的服务启动逻辑必须放在 else 分支(即 worker 进程内),并通过 require() 加载服务模块:
- worker 启动后,调用
require('./server')或require('./app'),加载你封装好的 HTTP 服务类或 Express/Koa 应用实例 - 该模块内部可自由使用
require引入拦截器、路由、数据库连接等,全部在当前 worker 进程内存中初始化 - 避免在主进程中
require服务模块(否则会提前执行、共享状态、引发冲突)
模块导出需适配进程上下文
你封装的服务模块(如 server.js)应设计为“可重复加载”,不依赖全局单例,也不在模块顶层直接 listen():
- 推荐导出一个构造函数或工厂函数,例如:
module.exports = (port) => { /* 创建 server 并返回 */ }; - 或导出一个类,由 worker 实例化:
const HttpServer = require('./HttpServer'); new HttpServer().listen(3000); - 禁止在模块顶层写
http.createServer(...).listen(3000),否则主进程加载时就会报错(端口被占或未进入 worker 上下文)
共享配置但隔离状态
配置文件(如 config.js)可以用 CommonJS 正常 require,因为它是只读数据,多个 worker 加载不会冲突:
立即学习“Java免费学习笔记(深入)”;
- 各 worker 独立
require('./config'),获得相同配置对象的副本(非引用共享) - 数据库连接、缓存客户端等有状态资源,必须在 worker 内部创建(不能在 config 中 new 实例后导出)
- 若需跨进程共享 session 或锁,必须外置(如 Redis),不能靠模块变量或文件系统
拦截器与中间件按需加载
像日志、鉴权、请求体解析等通用逻辑,适合封装为独立模块,再由每个 worker 自行 require 和挂载:
- 例如:
const logger = require('./middleware/logger');,然后传给createServer或集成进框架 - 确保这些模块无副作用:不修改全局对象、不缓存跨请求数据、不复用未设计为并发安全的实例
- 若使用 Express,每个 worker 可独立
const app = express(); app.use(logger);,完全隔离


















