Spring MVC, @SessionAttribute и масштабируемость - PullRequest
4 голосов
/ 29 февраля 2012

Мы создаем веб-приложение Spring-MVC для 80 000 пользователей.

В примере с петклиникой я вижу много контроллеров, использующих: @SessionAttribute аннотация и SessionStatus status ... status.setComplete() для хранения и удаления bean-компонентов из HTTP-сессии. Очень полезно на самом деле.

Это лучший способ, если вы планируете создать приложение для 80 000 пользователей? Не могли бы вы по-прежнему использовать балансировку нагрузки сеанса и восстановление после сбоя сеанса, если планируете хранить все данные формы, как это?

1 Ответ

3 голосов
/ 29 февраля 2012

Это, вероятно, не будет соответствовать вашим потребностям, нет.Есть две принципиальные проблемы со встроенной реализацией:

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

  2. Если пользователи не следуют вашему «запланированному»навигационный путь, по которому setComplete() вызов будет пропущен, и объект будет зависать бесконечно, пока не закончится сеанс и не будет очищен.

Номер 1 может или не может быть проблемой в зависимости от того, как разработано ваше приложение и что оно делает.(некоторые вещи, например, Банки, в любом случае намеренно мешают использованию нескольких вкладок) Но большинство пользователей, я думаю, ожидают, что смогут редактировать профиль пользователя А на одной вкладке и профиль пользователя Б на другой вкладке и не будут отправлять одну форму, нарушая другую.screen.

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

Хорошая новость в том, что org.springframework.web.bind.support.SessionAttributeStore является признанной точкой расширения!Вы можете предоставить любую реализацию того, что вам нравится, и добавить ее в свой сервлет-диспетчер.Вам даже не нужно использовать веб-сессию для хранения информации, если вы хотите избежать раздувания ее с бизнес-объектами.Вы можете поместить это фактическое хранилище в бэкэнд-терракотовый кластер, например, и не беспокоиться о его совместимости с вашей стратегией кластеризации.

-

И тогда всегда есть опция Gamma, если вам действительно нужноистинная масштабируемость: переделайте ее в стратегию RESTful, которая в первую очередь не зависит от состояния сервера:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...