Bluemix Node.js 在多个实例中使用会话
Bluemix Node.js work with session in multiple instances
当项目有两个或更多实例时,我的 bluemix 应用程序出现问题。
如果我只保留项目一个实例,此代码将按预期工作,并且当调用 url '/load' 时,我会收到保存在 '/save' 中的数据。但是,当我在应用程序中放置更多实例时,'/load' 大多数时候什么都不发送。
它就像会话保存在项目的一个实例中,当用户点击另一个实例时 url,'/load' 正在另一个实例中执行。
那么,有谁知道如何确保用户只使用一个实例或在实例之间共享会话值吗?
var express = require('express');
var session = require('express-session');
var cfenv = require('cfenv');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
app.use(express.static(__dirname + '/public'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(session({
resave: 'false',
saveUninitialized: 'true',
secret: 'cub1ksqu4d_mysp0t'
}));
var appEnv = cfenv.getAppEnv();
app.get("/save", function (req, res) {
req.session.fullname = "John Galt";
res.send("Saved session");
});
app.get("/load", function (req, res) {
res.send(req.session.fullname);
});
app.listen(appEnv.port, '0.0.0.0', function () {
console.log("server starting on " + appEnv.url);
});
似乎每个实例都有自己的请求管理器,它不是共享的,每个请求在所有实例中都是平衡的。
您可以让 /save 接受一个名称参数并测试以不同的名称执行 /save 几次,然后 /load 以查看它是否 returns "randomly" 不同的名称给出。
如果您想通过多个实例共享信息,我建议您在您的应用程序上使用数据库服务。
您应该将您的应用程序设计为无状态进程。这实际上是 12 factors (see 12 factor app).
之一
如果您想在调用之间和应用实例之间共享状态,常见的做法是使用数据库来存储该数据。有一些框架允许 data/states 跨实例缓存。
当项目有两个或更多实例时,我的 bluemix 应用程序出现问题。
如果我只保留项目一个实例,此代码将按预期工作,并且当调用 url '/load' 时,我会收到保存在 '/save' 中的数据。但是,当我在应用程序中放置更多实例时,'/load' 大多数时候什么都不发送。
它就像会话保存在项目的一个实例中,当用户点击另一个实例时 url,'/load' 正在另一个实例中执行。
那么,有谁知道如何确保用户只使用一个实例或在实例之间共享会话值吗?
var express = require('express');
var session = require('express-session');
var cfenv = require('cfenv');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
app.use(express.static(__dirname + '/public'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(session({
resave: 'false',
saveUninitialized: 'true',
secret: 'cub1ksqu4d_mysp0t'
}));
var appEnv = cfenv.getAppEnv();
app.get("/save", function (req, res) {
req.session.fullname = "John Galt";
res.send("Saved session");
});
app.get("/load", function (req, res) {
res.send(req.session.fullname);
});
app.listen(appEnv.port, '0.0.0.0', function () {
console.log("server starting on " + appEnv.url);
});
似乎每个实例都有自己的请求管理器,它不是共享的,每个请求在所有实例中都是平衡的。
您可以让 /save 接受一个名称参数并测试以不同的名称执行 /save 几次,然后 /load 以查看它是否 returns "randomly" 不同的名称给出。
如果您想通过多个实例共享信息,我建议您在您的应用程序上使用数据库服务。
您应该将您的应用程序设计为无状态进程。这实际上是 12 factors (see 12 factor app).
之一如果您想在调用之间和应用实例之间共享状态,常见的做法是使用数据库来存储该数据。有一些框架允许 data/states 跨实例缓存。