Nodejs scoket.io使用cluster模块问题
Nodejs scoket.io使用cluster模块问题
socket.io使用了cluster模块,但每次连接的时候都报{“code”:1,“message”:“Session ID unknown”} 这个错误,有人知道是什么原因吗?不用cluster没有问题。
4 回复
这个问题解了吗 :)
在使用 socket.io
和 cluster
模块时遇到 { "code": 1, "message": "Session ID unknown" }
错误,通常是因为每个工作进程无法共享会话数据。你可以通过使用一个共享存储来解决这个问题,例如使用 Redis 存储会话数据。
以下是一个简单的示例,展示如何使用 Redis 存储会话数据来避免这个错误:
示例代码
-
安装所需的库:
npm install socket.io redis
-
创建一个 Redis 存储实例:
const redis = require('redis'); const RedisStore = require('socket.io-redis'); const pub = redis.createClient(); const sub = redis.createClient(); // 使用 Redis 存储会话数据 module.exports = { pub, sub, store: RedisStore({ pub, sub }) };
-
在主进程中初始化
socket.io
并将RedisStore
传递给客户端:const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; const io = require('socket.io'); const { pub, sub, store } = require('./redis-store'); if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); }); } else { const app = require('express')(); const server = http.createServer(app); const socket = io(server, { adapter: store }); socket.on('connection', (client) => { console.log('Client connected:', client.id); client.on('disconnect', () => { console.log('Client disconnected:', client.id); }); }); server.listen(3000, () => { console.log('Server is running on port 3000'); }); }
解释
- Redis 存储实例:我们创建了一个 Redis 实例,并将其用作
socket.io
的适配器。 - 主进程:在主进程中,我们使用
cluster
模块创建多个工作进程,并将RedisStore
传递给每个工作进程。 - 工作进程:每个工作进程都使用相同的 Redis 实例作为
socket.io
的适配器,确保所有工作进程可以共享会话数据。
这样配置后,你应该能够避免 { "code": 1, "message": "Session ID unknown" }
错误,并且能够正常处理 WebSocket 连接。