如何在SvelteKit中使用Node.js Cluster模块?
如何在SvelteKit中使用Node Cluster模块
为什么不能在hooks.server.js中实现集群
直接在hooks.server.js里写集群逻辑完全行不通,核心原因有两点:
hooks.server.js是SvelteKit的生命周期钩子文件,会在每个请求处理流程中被加载执行。主进程fork子进程后,子进程又会重复加载这个文件,触发新一轮的fork操作,最终导致无限递归创建进程,直接引发进程爆炸。- SvelteKit的路由分发、请求处理逻辑是框架内部管控的,hooks只是请求链路中的中间环节,无法替代独立服务器入口来控制整个进程的启动流程。
正确的实现方式:自定义服务器入口
SvelteKit的Node适配器支持我们创建自定义服务器入口文件,在这个文件中实现Cluster集群逻辑,再将SvelteKit的请求处理handler挂载到每个子进程的HTTP服务器上。
步骤1:配置Node适配器
如果还没安装Node适配器,先执行安装命令:
npm install @sveltejs/adapter-node
然后在项目根目录的svelte.config.js中配置适配器:
import adapter from '@sveltejs/adapter-node'; export default { kit: { adapter: adapter() } };
步骤2:编写集群服务器文件
在项目根目录创建server.js文件,内容如下:
const cluster = require('node:cluster'); const http = require('node:http'); const { availableParallelism } = require('node:os'); // 引入SvelteKit构建后的请求处理handler const { handler } = require('./build/server/index.js'); // 获取CPU核心数,按需创建子进程 const numCPUs = availableParallelism(); if (cluster.isPrimary) { console.log(`主进程 ${process.pid} 正在运行`); // 根据CPU核心数fork子进程 for (let i = 0; i < numCPUs; i++) { cluster.fork(); } // 子进程意外退出时自动重启 cluster.on('exit', (worker) => { console.log(`子进程 ${worker.process.pid} 退出,正在重启`); cluster.fork(); }); } else { // 每个子进程启动HTTP服务器,挂载SvelteKit的handler const server = http.createServer(handler); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`子进程 ${process.pid} 已启动,监听端口 ${PORT}`); }); }
步骤3:修改启动脚本
在package.json中更新启动脚本,先构建项目再启动集群服务器:
{ "scripts": { "build": "vite build", "start": "node server.js" } }
运行方式
先执行项目构建:
npm run build
再启动集群服务器:
npm run start
补充说明
- 这种方式能充分利用服务器的多核资源,让每个CPU核心都运行一个SvelteKit子进程,提升服务的并发处理能力。
- 主进程负责监控子进程状态,当子进程意外退出时会自动重启,保障服务的可用性。
内容的提问来源于stack exchange,提问作者takinola
相关产品推荐
相关产品推荐

