У меня будет 3 сервера Tomcat и балансировщик нагрузки, который отправляет запросы без использования 'sticky sessions'.
Я хочу поделиться данными сеансов между серверами, и я думаю, что они сохраняют их в БД. Я хотел бы использовать memcached в качестве слоя перед моей БД, чтобы быстрее обслуживать запросы и don't put my db under heavy load.
Я думаю о предоставлении моего настроенного диспетчера tomcat, который использует memcached, прежде чем получать/сохранять данные сеанса в БД, поскольку на данный момент я не вижу прозрачного способа сделать это (это означает, что мне нужно будет управлять им снова в случае, если я переключусь на другой сервер приложений).
Это хорошее решение или вы видите лучший подход?Share Сессии между экземплярами tomcat (без использования Sticky Sessions)
ответ
Мы делаем аналогичную вещь в нашем приложении (Weblogic, но это не имеет значения), где у нас есть уникальный ключ сеанса, который хранится в виде файла cookie в браузере. Затем этот ключ будет использоваться при каждом запросе для восстановления соответствующих данных сеанса из базы данных.
Используя этот принцип, мы всегда можем переключиться на другой сервер с помощью балансировщика нагрузки, не заметив ничего. В дополнение к этому мы почти ничего не храним в сеансе пользователя и работаем с большим количеством скрытых полей в браузере (балансировщик нагрузки поддерживает шифрование URL и защиту формы, поэтому мы в безопасности) ,
Я думаю, Terracotta Web Sessions - это то, что вы хотите.
Сохранение состояния сеанса вне серверов приложений (Tomcat в вашем случае), является очень распространенной и рекомендуемой конфигурацией для крупномасштабных веб-сайтов. Обычно это делается в поисках архитектурного стиля под названием Shared Nothing.
Вы можете сохранить свое состояние в нескольких разных местах: db, memcached, коммерческий реплицированный кеш и т. Д. Все они работают с различными смесями компромиссов. Лично я имел большой успех с memcached. Memcached чрезвычайно быстрый и стабильный.
Как правило, я выбираю простоту и использую N серверов memcache, где N> 1, скажем 2. Когда пользователи входят в систему, серверы приложений переворачивают монету, чтобы решить, какой сервер хранит состояние пользователя. Куки-файлы, отправленные в браузер, включают информацию о том, какой сервер memcache будет маршрутизироваться с этого момента. Последующие запросы из состояния выбора браузера из соответствующего сервера memcache по каждому запросу. Если сервер memcache терпит неудачу, пользователю придется снова войти в систему, поскольку серверы приложений повторно выбирают новый сервер, но это крайне редко.
Устойчивые сеансы в базе данных ограничивают вашу масштабируемость. Если масштабируемость не так важна для вас, это (db + memcached) является допустимым подходом.
Одна вещь, о которой вам нужно помнить при использовании нестатистических сеансов, - это одновременные запросы: когда у вас есть, например, ajax-запросы (выполняются параллельно/одновременно), они будут обслуживаться разными кошками (из-за нелипкости) и, следовательно, одновременно обращаться к сеансу. Пока у вас есть параллельные запросы, которые могут изменить сеанс, вам нужно реализовать какую-то синхронизацию/сеансовую блокировку.
Возможно, вам это интересно: я создал memcached-session-manager с целью обеспечения оптимальной производительности и неограниченной масштабируемостью. Он может работать с любым совместимым с memcached бэкэнд (например, memcachedb, membase и т. Д. Или просто memcached). Хотя он был создан для подхода с липкими сессиями, уже существует branch for nonsticky-sessions и sample app, показывающий, как он работает. Прямо сейчас есть thread on the mailing list on further improvements for nonsticky-sessions (обработка одновременных запросов и предотвращение одноточечной ошибки).
Я просто хочу отметить здесь, что я только что выпустил memcached-session-manager с поддержкой нелипких сессий (и поддержкой tomcat7). Объявление с некоторыми подробностями относительно нелипких сеансов: http://groups.google.com/group/memcached-session-manager/t/612891b0ae10649d – MartinGrotzke
очень хорошее мнение о запросах ajax. Внутри одного потока может быть несколько запросов к серверу. – vsingh
- 1. Сеанс Tomcat между несколькими экземплярами tomcat
- 2. RequestDispatcher вперёд между экземплярами Tomcat
- 3. Как обмениваться сеансами между независимыми экземплярами tomcat
- 4. Связь между экземплярами tomcat (распределенная архитектура)
- 5. переменные класса Обмен между экземплярами без использования статических
- 6. Java, Tomcat, Sessions - JSessionId исчезает
- 7. Android: Share файл между двумя приложения без использования внешних накопителей
- 8. Селен FirefoxDriver: Share Session/Cookies между различными экземплярами
- 9. Обмен хранилищами между экземплярами
- 10. PHP HybridAuth библиотека без использования PHP-сессии
- 11. Различия между экземплярами
- 12. Соединяют ли пулы соединений Tomcat JDBC между экземплярами?
- 13. Вафли дают разные имена пользователей между экземплярами Tomcat
- 14. Tomcat Сессия кластеризации не работает между двумя экземплярами машины
- 15. Общее состояние между экземплярами CloudService
- 16. Сессии с кластерными экземплярами Oracle Application Server
- 17. SQLAlchemy Sessions: Сохранение между сеансами?
- 18. Использовать переменные SESSIONS между разными php-файлами
- 19. Какова цель использования сессии в WCF
- 20. Разница между Phoenix Sessions и Phoenix.Token
- 21. share TouchEvent между фрагментами
- 22. Синхронизировано между экземплярами объекта
- 23. связи между экземплярами приложения
- 24. Связь между экземплярами servicestack
- 25. Данные Drag'n'drop между экземплярами
- 26. Объявление различий между экземплярами
- 27. связь между экземплярами классов
- 28. соединение между экземплярами ec2
- 29. Связь между экземплярами EC2
- 30. Share socket между процессами в Perl (без вилки)?
@Lucas Eder у нас есть аналогичная настройка, разница заключается в том, что мы используем Memcached для хранилища сеансов. – Nishant
Для некоторых приложений это «не имеет значения» (т. Е. Данные сеанса не могут считаться чувствительными в отношении пользователя, прошедшего проверку подлинности), но в принципе переносят «сеансовые» данные взад и вперед - как «скрытые» поля (из Конечно, никакие поля на HTML-странице по-настоящему не скрыты от пользователя) или как файлы cookie, созданные для этой цели, - это плохая практика. Если клиентская сторона приложения не нуждается в этих данных, она не должна отображаться в браузере. –
@ DanFarrell: скрытые поля не были чувствительными данными, а защита формы-значения не позволяла ему настраиваться. Поэтому я не понимаю, как это будет плохой практикой, с точки зрения безопасности. Было, конечно, много накладных данных передачи данных ... –