首页 文章

如何在bluemix上配置socket.io粘性会话

提问于
浏览
1

我需要在IBM Bluemix上部署一个带有多个cloudfoundry实例的socket.io应用程序,以确保负载 balancer .

我按照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))
})

经过几个小时在Google上搜索,我不知道该怎么办了 . 我真的需要一些帮助 .

先感谢您!

2 回答

  • 1

    您正在使用小写 jsessionid . 尝试大写它 . Session 文档在这里:https://docs.cloudfoundry.org/concepts/http-routing.html#sessions

  • 0

    我最近这样做(尽管没有Redis),以解决同样的问题; socket.io和负载 balancer 器不能很好地开箱即用 . 关键是使用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);
    

相关问题