Сохранять сеанс в коа на нескольких серверах

У меня есть несколько серверов koa с балансировщиком нагрузки, использующим вход в систему с паспортом. Я хотел бы сохранить сеанс на всех серверах.

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

Я хотел бы сохранить объект сеанса в ОЗУ каждого сервера, и если балансировщик нагрузки перенаправляет пользователя на другой сервер, а сервер не распознает файл cookie, я бы хотел, чтобы он вернулся к базе данных и загрузил данные в свою оперативную память тоже.
Есть ли способ сделать это?

Спасибо.


person Avi Tshuva    schedule 05.05.2015    source источник


Ответы (3)


Для хранения сеанса вы можете использовать некоторые базы данных в памяти, в большинстве случаев это либо redis, memcached или mongodb< /а>. Вам нужно выделить сервер, на котором вы будете устанавливать ценное программное обеспечение, а затем настроить koa для их использования. Я хотел бы посоветовать вам Redis, следуя lib и пример реализации.

person vanadium23    schedule 05.05.2015
comment
Привет. Спасибо за ответ, но как я уже писал пробовал использовать централизованное хранилище, но это вызывало каждый раз запрос к хранилищу. Я хотел бы, чтобы централизованное хранилище было запасным вариантом, если сеанс не находится на текущем сервере. - person Avi Tshuva; 05.05.2015
comment
@AviTshuva это хранилище предназначено для хранения сеансов, потому что они также находятся в памяти и работают быстрее, чем MySQL, который вы пробовали. - person vanadium23; 05.05.2015
comment
Но они по-прежнему находятся на удаленном сервере, и я хотел бы избежать этих накладных расходов, за исключением случаев, когда я должен это сделать. - person Avi Tshuva; 05.05.2015

Мой ответ очень запоздал, но в большинстве балансировщиков нагрузки есть опция "фиксированные сеансы" (см. Постоянство сеанса), что означает, что запросы с одного и того же IP-адреса направляются в один и тот же процесс. Может быть, попробовать это!

person Brasilikum    schedule 01.06.2015

Вы можете использовать koa-сессию https://github.com/koajs/session.

Вот хороший учебник http://www.zev23.com/2014/03/koajs-tutorial-authenticate-with_7.html

Полный app.js скопирован из учебника.

"use strict"

const
  Router = require('koa-router'),
  passport = require('./auth'),
  session = require('koa-sess'),
  redisStore = require('koa-redis'),
  koa = require('koa'),
  app = koa();

//Middleware: request logger
function *reqlogger(next){
  console.log('%s - %s %s',new Date().toISOString(), this.req.method, this.req.url);
  yield next;
}
app.use(reqlogger);

//Initialize session
app.keys=['koa-tutorial'];
app.use(session({
  cookie: {maxAge: 1000 * 60 * 5},
  store : redisStore()
}));

//Initialize passport with session
app.use(passport.initialize());
app.use(passport.session());

app.use(Router(app));

app.get('/', function *(){
  console.log('Express-style example');
  this.body = "This is root page ('/')";
});

const publicRouter = new Router();

//Configure /auth/github & /auth/github/callback
publicRouter.get('/auth/github', passport.authenticate('github', {scope: ['user','repo']}));
publicRouter.get('/auth/github/callback',
  passport.authenticate('github', {successReturnToOrRedirect: '/', failureRedirect: '/'})
);

app.use(publicRouter.middleware());

//Secures routes
const securedRouter = new Router();

//Middleware: authed
function *authed(next){
  if (this.req.isAuthenticated()){
    yield next;
  } else {
    //Set redirect path in session
    this.session.returnTo = this.session.returnTo || this.req.url;
    this.redirect('/auth/github');
  }
}

securedRouter.get('/app', authed, function *(){
  this.body = 'Secured Zone: koa-tutorial\n' + JSON.stringify(this.req.user, null, '\t');
});

securedRouter.get('/app2', authed, function *(){
  this.body = 'Secured Zone: koa-tutorial APP2\n'
});

app.use(securedRouter.middleware());

app.use(function *(){
  this.body = 'Hello World';
});

app.listen(3000);
person nu everest    schedule 04.12.2016