如何在CloudFoundry / Bluemix上运行的LoopbackJS应用程序上启用粘性会话

时间:2016-11-08 14:38:15

标签: socket.io ibm-cloud loopbackjs cloudfoundry

我在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端的日志中看到该请求由另一个应用实例提供。

我对这些主题缺乏经验,所以非常感谢任何有助于正确配置粘性会话的建议。

1 个答案:

答案 0 :(得分:0)

https://docs.cloudfoundry.org/concepts/http-routing.html#sessions

“在后续请求中,客户端必须同时提供JSESSIONID和VCAP_ID cookie.CF路由层每次都使用VCAP_ID将客户端请求转发到同一个应用程序实例。”

e.g。选择VCAP_ID并与JSESSIONID一起提供