Управление сессией в распределенном приложении - PullRequest
7 голосов
/ 03 сентября 2010

Я работаю над распределенным веб-приложением, и мы решили отделить веб-модуль от бизнес-сервисов, чтобы сделать его более масштабируемым.

Вот ситуация: у нас есть один экземпляр сервера, который хранит веб-приложение (контроллеры,JSP и т. Д.) И множество экземпляров серверов с бизнес-сервисами.Если веб-приложению нужны какие-либо данные, оно запрашивает об этом у любого существующего бизнес-сервера через Hessian, затем получает ответ и отображает данные.

В настоящее время мы извлекаем данные из БД на основе зарегистрированного пользователя, и это нельзя изменить,поэтому каждый сервер должен знать, какого пользователя попросили выполнить эту работу.

Мой вопрос таков: знаете ли вы решение для сохранения сеанса пользователя в нескольких независимых приложениях?

Например, одно из решений можетотправлять имя пользователя при каждом запросе, но это не очень хорошая идея для нас.

Большое спасибо

Ответы [ 2 ]

6 голосов
/ 03 сентября 2010

Есть 2 подхода к этой проблеме:

1) Хранить всю информацию о сеансе на центральном сервере memcached

2) Используйте балансировщик нагрузки с учетом сеанса, который будет направлять одних и тех же пользователей к одним и тем же узлам.

4 голосов
/ 05 сентября 2010

Используйте распределенную хеш-таблицу для хранения и получения ваших сеансов с любого сервера.Попробуйте Hazelcast , например.Это открытый исходный код и супер просто;см. образец ниже.

Map<String, Session> mapSessions  = Hazelcast.getMap("sessions");
// session is created or updated so put it into the sessions map
mapSessions.put(sessionId, session);
// any server needing to access a session should just retrieve
// it from the map. 
// Map is distributed/shared so any JVM running Hazelcast can
// read the sessions.
Session session = mapSessions.get(sessionId);

Hazelcast является одноранговым.Просто включите одну банку и начните делиться своими сессиями.

...