2010-09-03 3 views
5

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

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

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

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

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

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

+0

Спасибо всем. Я нашел лучшее решение. Мы просто должны добавить имя пользователя (или что-то еще) в качестве заголовка запроса HTTP и получить его с другой стороны. С Hessian очень легко вывести только HessianProxy и реализовать метод addRequestHeaders (URLConnection). Будьте внимательны – oyushche

ответ

2

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

1) хранить все данные сеанса в центральном Memcached сервере

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

+0

3) Храните все сеансы в реплицируемой базе данных master-master, которая поддерживает несколько реплик каждого сеанса. Таким образом, у вас будет переход на другой ресурс. Кроме того, см. Мой внушительный ответ здесь, который может дать вам некоторое представление: http://stackoverflow.com/a/8443896/260805 – Ztyx

4

Использование распределенной хэш-таблицы для хранения и получения сеансов с любого сервера. Например, попробуйте 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 является равным-равным. Просто включите одну банку и начните делиться своими сеансами.

Смежные вопросы