Узел Bluemix.работа js с сеансом в нескольких экземплярах

У меня есть проблема в моем приложении bluemix, когда проект имеет два или более экземпляров.

Если я сохраняю проект только с одним экземпляром, этот код работает как ожидалось, и когда вызывается url ‘/load’, я получаю данные, сохраненные в ‘/save’. Но, когда я помещаю больше экземпляров в приложение,’ /load ‘ отправляет ничего в большинстве случаев.

Its like the session is saved in one instance of the project and when the user hits another url, the’ /load ‘ is being executed in another instance.

Итак, знает ли кто-нибудь, как убедиться, что пользователь использует только один экземпляр или разделяет значение сеанса между экземплярами?

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);
});

2 ответа

  1. Кажется, что каждый экземпляр имеет свой собственный менеджер запросов, и он не является общим, и каждый запрос сбалансирован по всем экземплярам.

    Вы можете сделать /save, чтобы взять параметр name и проверить, чтобы выполнить /save несколько раз с разными именами, а затем /load, чтобы увидеть, если он возвращает «случайно» различные имена.

    Если вы хотите обмениваться информацией через несколько экземпляров, я бы рекомендовал использовать службу БД в вашем приложении.

  2. Вы должны создать приложение как процесс без отслеживания состояния. Это на самом деле один из 12 факторов (см. Приложение 12 factor ).

    Если вы хотите совместно использовать состояние между вызовами и экземплярами приложения, обычно для хранения этих данных используется база данных. Существуют платформы, позволяющие кэшировать данные / состояния в экземплярах.