我在IBM Bluemix上部署了LoopbackJS应用程序,并横向扩展了3个实例。这个应用程序还使用Socket.io来实现聊天系统。
我想激活粘性会话,以便来自同一客户端的每个请求都会路由到同一个应用实例。
我知道根据12 factors应该避免粘性会话。但它似乎是唯一的解决方案,以使socket.io能够与多个节点正常工作。
如上所述here,似乎我需要在环回应用程序中设置JSESSIONID会话cookie。
然后我在LoopbackJS应用程序的server.js中执行了以下操作:
var session = require('express-session');
app.use(session({
secret: 's3Cur3',
name: 'JSESSIONID',
proxy: true,
resave: true,
saveUninitialized: true
}));
进行更改后,当我向Loopback应用程序发出请求时,我可以看到响应标头中设置了两个cookie:
Set-Cookie:__VCAP_ID__=988ce9aa9b7f49cdb31d04f697d892b6024579565ea443589ed10e7a4c1c05f0; Path=/; HttpOnly, JSESSIONID=s%3Adb3KsqgZfkwEg39wrLKcsB3AWpazcOgd.TcA1vYbVB5DqemJXDS%2BLxUJ207WNC7UGmS5BpjZQ9Xc; Path=/; HttpOnly; Secure
Set-Cookie:JSESSIONID=s%3Adb3KsqgZfkwEg39wrLKcsB3AWpazcOgd.TcA1vYbVB5DqemJXDS%2BLxUJ207WNC7UGmS5BpjZQ9Xc; Path=/; HttpOnly
无论如何,当我再次从同一个浏览器发出请求时,我可以在Bluemix端的日志中看到该请求由另一个应用实例提供。
我对这些主题缺乏经验,所以非常感谢任何有助于正确配置粘性会话的建议。
答案 0 :(得分:0)
每https://docs.cloudfoundry.org/concepts/http-routing.html#sessions
“在后续请求中,客户端必须同时提供JSESSIONID和VCAP_ID cookie.CF路由层每次都使用VCAP_ID将客户端请求转发到同一个应用程序实例。”
e.g。选择VCAP_ID并与JSESSIONID一起提供