我需要在IBM Bluemix上部署一个带有多个cloudfoundry实例的socket.io应用程序,以确保负载平衡。
我遵循了socket.io文档和这个link来使用粘性会话,并确保每个套接字都转到正确的实例。
不幸的是,我的客户端在连接事件和错误' 400 xhr poll'之后断开连接。错误被解雇了。
这是我的服务器代码:
const cookieParser = require('cookie-parser')
const session = require('express-session')
const redis = require('redis')
const app = require('express')()
const http = require('http').Server(app)
const io = require('socket.io')(http)
const RedisStore = require('connect-redis')(session)
const redisUrl = 'myredis'
var session = session({
store: new RedisStore({client: client}),
secret: 'mysecret',
name: 'jsessionid',
resave: true,
saveUninitialized: true
})
app.use(cookieParser)
app.use(session)
io.on('connection', function (socket) {
console.log('a user is connected')
socket.on('testPing', function () {
socket.emit('testPong', {})
})
})
http.listen(process.env.PORT || 3000, function () {
console.log('listening on *:' + (process.env.PORT || 3000))
})
经过几个小时在谷歌搜索后,我不知道该怎么办了。我真的需要一些帮助。
提前谢谢!
答案 0 :(得分:1)
您使用的是小写jsessionid
。尝试大写它。会议文档在这里:https://docs.cloudfoundry.org/concepts/http-routing.html#sessions
答案 1 :(得分:0)
我最近这样做(虽然没有Redis),以解决同样的问题; socket.io和负载均衡器不能在开箱即用的情况下很好地协同工作。关键是使用JSESSIONID cookie来实现会话亲和性。这是我的代码:
const expressSession = require('express-session');
...
var app = express();
...
app.use(
expressSession({
key: 'JSESSIONID', // use a sticky session to make sockets work
secret: 'arbitrary-secret',
cookie: {
maxAge: 24 * 60 * 60 * 1000, // 1 day
secure: false
},
saveUninitialized: false,
resave: false
})
);
//setting up socket.io for realtime communication
var http = require('http').Server(app);
var io = require('socket.io')(http);