nodejs的express负载均衡

我们知道nodejs是单线程的,在特定场合是不能利用CPU多核的优势的。一般有两种方式来解决,一种是利用nodejs的cluster模块创建多个子进程来处理请求以充分利用cpu的多核,还有一种是nodejs运行多个服务分别监听在不同的port,利用nginx创建一个upstream池,来分发请求到nodejs的不同服务端口来处理。

由于我们是要负载均衡express,涉及到用户的会话保持就很重要,不然原先建立请求的是进程A,下次请求转到进程B处理,进程B没有之前用户在进程A的上下文信息,那么处理就会出现问题。

cluster方式下,推荐使用redis来存储会话

javascript 复制代码
var jargs = require('./argsfile.json');
const { createClient } = require('redis');
const client = createClient({ url: jargs.redisurl });
client.on('error', err => { logger.error("Redis连接出错"); });
client.connect();
const { RedisStore } = require('connect-redis-session');
...
app.use(session({
	name: jargs.sessionname,
	secret: jargs.ssosecret,
	store: new RedisStore({ client }), 
	saveUninitialized: true,
	resave: true,
	cookie: { httpOnly: true, maxAge: jargs.sessionage }
	}));

这样会话保存在redis中,不同进程可以共享session信息。

用户nginx upstream池怎么操作呢?其实也可以用redis来共享session的,还可以利用nginx自己的ip_hash策略来确保用户请求源IP固定的情况下,只会连接到upstream池中特定后端目标,这样也不会导致会话丢失。

lua 复制代码
	upstream svc_pool {
		ip_hash;
		server 172.17.36.50:8031;
		server 172.17.36.50:8032;
		server 172.17.36.50:8033;
		server 172.17.36.50:8034;
		server 172.17.36.50:8035;
		server 172.17.36.50:8036;
		server 172.17.36.50:8037;
		server 172.17.36.50:8038;
		}
相关推荐
没事别瞎琢磨几秒前
十二、网络代理与白名单规则引擎
人工智能·node.js
没事别瞎琢磨4 分钟前
十四、Git Worktree 隔离执行
人工智能·node.js
没事别瞎琢磨1 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨1 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨2 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨3 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨3 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js
没事别瞎琢磨3 小时前
四、命令风险分级与审批策略
人工智能·node.js
没事别瞎琢磨3 小时前
三、配置系统——默认值与解析
人工智能·node.js
右耳朵猫AI4 小时前
Node.js周刊2026W22 | Node.js 26、Deno 2.8、Rolldown 1.0、TypeORM 1.0、Bun v1.3.14
node.js