Подтвердить что ты не робот

Масштабируемое управление сеансом http (java, linux)

Существует ли наилучшая практика для масштабируемого управления сеансами http?

Проблемное пространство:

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

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

В целом, похоже, существует несколько подходов:

  • Не проводить сеансы; Всегда запускайте без гражданства, религиозно [не работает для меня...]
  • Используйте j2ee, ejb и остальную часть этой банды
  • используйте базу данных для хранения сеансов. Я полагаю, что есть инструменты, чтобы сделать это проще, поэтому мне не нужно создавать все самостоятельно.
  • Используйте memcached для хранения сеансов (или другого промежуточного, полупостоянного хранилища).
  • Используйте ключ-значение DB. "более стойкий", чем memcached
  • Используйте "сеансы на стороне клиента", то есть вся информация о сеансе живет в полях скрытой формы и передается вперед и назад от клиента к серверу. На сервере ничего не хранится.

Любые предложения? Благодаря

4b9b3361

Ответ 1

Я бы пошел с некоторым стандартным распределенным кэшем. Может быть, ваш сервер приложений предоставлен, может быть memcached, может быть terracotta Наверное, не слишком важно, какой из них вы выберете, если вы используете что-то достаточно популярное (так что вы знаете, что большинство ошибок уже выслежено).

Что касается ваших других идей:

  • Не держите сессию - как вы сказали, невозможно
  • Сессия на стороне клиента - слишком небезопасная - предположим, что кто-то взломал файл cookie, чтобы поставить скидки в корзине.
  • Использовать базу данных - базы данных, как правило, являются самым трудным узким местом для решения, не кладите туда больше, чем вам абсолютно необходимо.

Это мои 2 цента:)

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

Ответ 2

Вы, кажется, пропустили ваниль, реплицированную http-сессиями из своего списка. Любой контейнер сервлета, достойный его соли, поддерживает репликацию сеансов в кластере. Пока элементы, которые вы вводите в сеанс, не являются огромными и могут быть сериализованы, тогда очень легко заставить его работать.

http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

edit: Кажется, однако, что репликация сеанса tomcat недостаточно масштабируется для больших кластеров. Для этого я бы предложил использовать JBoss + Tomcat, который дает идею "репликации приятеля":

http://www.jboss.org/community/wiki/BuddyReplicationandSessionData

Ответ 3

Я лично не управлял такими кластерами, но когда я взял курс J2EE в университете, лектор сказал, чтобы хранить сеансы в базе данных и не пытаться кэшировать его. (Вы все равно не можете кэшировать динамические страницы.) Http-сессии на стороне клиента определяются по определению, поскольку идентификатор сеанса является файлом cookie. Если клиент отказывается хранить файлы cookie (например, он параноик об отслеживании), то он не может иметь сеанс. Вы можете получить этот идентификатор, вызвав HttpSession.getId().

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

Насколько я знаю, как сообщения с состоянием beans, так и обычные HTTP-сеансы сервлетов существуют только в памяти без встроенной балансировки нагрузки.

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

Ответ 4

Я предпочел бы уйти от хранения состояния пользовательского приложения в сеансе HTTP, но для этого потребуется другое представление о том, как работает приложение, и использовать архитектуру без устаревания RESTful. Обычно это относится к отказу от поддержки более ранних версий браузеров, которые не поддерживают архитектуры MVWW на стороне клиента.

Корзина не является состоянием пользовательского приложения. Это состояние приложения, что означает, что оно будет храниться в базе данных и управляться как таковое. Может быть таблица ассоциаций, которая связывает пользователя с одной или несколькими тележками, предполагая, что возможен обмен телегами.

Самое большое препятствие, вероятно, будет заключаться в том, как аутентифицировать пользователя для каждого запроса, если он не имеет гражданства. BASIC auth - это самый простой подход, который не включает сеансы, FORM-auth потребует сеансов независимо. Реализация JASPIC (например, HTTP-заголовки или OAuth) сможет смягчить ваши проблемы с проверкой подлинности в другом месте, и в этом случае cookie может использоваться для управления вашим токеном аутентификации (например, FORM-auth) или HTTP-заголовком, например, SiteMinder или клиентскими сертификатами на стороне сервера.

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