You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:22:37