Cluster 进阶:HTTP 请求亲缘性与共享端口策略
利用 cluster 模块实现粘性会话 (sticky sessions) 与自定义负载均衡,超越默认的 round-robin。 · 难度:入门 · +10XP
请求亲缘性与端口共享
Node.js cluster 默认使用 round-robin 分发连接,但某些场景(如 WebSocket)需要同一客户端始终连接到同一 Worker。你可以通过监听 'request' 事件,解析 cookie 或 IP 哈希,然后手动调用 worker.send 并避免 socket 迁移。另外可以使用 SO_REUSEPORT 让多个 Worker 监听同一端口由内核分发。本教程实现一个简单的 IP 哈希粘性负载均衡器。
const cluster = require('cluster');
const http = require('http');
const workers = [];
if (cluster.isMaster) {
for (let i = 0; i < 4; i++) workers.push(cluster.fork());
// 主进程只转发请求
} else {
http.createServer((req, res) => {
const ip = req.connection.remoteAddress;
const idx = ip.split('.').reduce((a, b) => a + parseInt(b), 0) % workers.length;
// 实际上需要代理请求,这里仅输出
res.end(ip);
}).listen(8000);
}