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;
		}
相关推荐
tryCbest9 分钟前
Vue3项目在Nginx中配置代理后端IP
nginx·vue3
就叫飞六吧1 小时前
DeepSeek Harness 本地安装与启动指南
nginx
八角丶5 小时前
Node.js Cluster 详解
前端·node.js
難釋懷7 小时前
Nginx主动健康检查
运维·nginx
濮水大叔9 小时前
CabloyJS 强大之处不仅仅是 IoC,而是全栈资源的寻址体系
typescript·node.js·全栈
COOLMO研究AI9 小时前
Python 如何实现 AI API 的动态路由与多通道负载均衡:多账号与多供应商的高可用调度
人工智能·python·负载均衡
烂蜻蜓10 小时前
Node.js入门教程(二十六):内置模块
node.js
东方小月10 小时前
从零开发一个 Coding Agent(十一):实现 CLI 的 print 模式
node.js·全栈
__zRainy__11 小时前
Node系列 · Node基础:ES 模块化
node.js
FungLeo12 小时前
Node 后端实战 · 后端敏感数据怎么防泄露?PII 自动脱敏与审计日志实战
node.js·数据脱敏·数据防泄漏·pii 脱敏