2015-05-05 3 views
3

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

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

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

Спасибо.

ответ

2

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

+0

Hi. Спасибо за ответ, но, как я писал, я пытался использовать централизованное хранилище, но каждый раз это вызывало запрос к хранилищу. Я хотел бы, чтобы централизованное хранилище было резервным, если сеанс не находится на текущем сервере. –

+0

@AviTshuva Это хранилище предназначено для хранения сеансов, поскольку они также находятся в памяти и быстрее, чем MySQL, который вы пробовали. – vanadium23

+0

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

0

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

0

Вы можете использовать koa-session 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); 
Смежные вопросы