почему нам иногда нужно хранить сессии в базе данных? - PullRequest
0 голосов
/ 02 июля 2010

Мне сказали, что одной из распространенных причин хранения сеансов в базе данных является ее кросс-серверность.Но разве TCP-соединение не сохраняется до тех пор, пока браузер не закроется?Почему следующий запрос может переключить другой сервер?

Ответы [ 3 ]

3 голосов
/ 02 июля 2010

Но разве TCP-соединение не сохраняется, пока не закроется браузер? Почему следующий запрос может переключить другой сервер?

Как только веб-страница загружается и все изображения, файлы CSS и другие ресурсы извлекаются, вскоре после этого TCP-соединение будет закрыто ( через 5 секунд по умолчанию в Apache 2.2, например). Когда пользователь нажимает на другую внутреннюю ссылку, открывается новое TCP-соединение. Это может оказаться на другом сервере в многосерверном сценарии с балансировкой нагрузки.

1 голос
/ 02 июля 2010

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

Один запросна веб-страницу перейдет на один сервер.В следующий раз, когда пользователь сделает запрос, будет создано новое TCP-соединение, которое можно будет отправить на другой сервер в ферме.

0 голосов
/ 02 июля 2010

Загрузка страниц в браузере обычно не имеет состояния (т. Е. Они не сохраняют состояние после полной загрузки страницы).

Это означает, что ваша следующая страница загружается, что может быть так же просто, как переходить изстраница торгового каталога на страницу корзины, отдельный HTTP «сделка».

1004 * в самом деле, вполне возможно, что текст страницы и его 12 изображений (и 400 порно объявления) каждый могут перейти кполностью отдельный сервер (даже если они используют один и тот же базовый URL), поскольку они могут работать в разных сеансах TCP.

Вы не хотите сериализовать весь трафик, чтобы можно было повторно использовать один сеанс TCP,обычно быстрее выполнять их параллельно в отдельных сеансах.

Так что это может оказаться на совершенно другом сервере, да.В этом случае вы бы хотели, чтобы состояние сохранялось в каком-то общем ресурсе (например, в базе данных).

Существуют и другие способы решения проблемы (всегда есть), такие как привязка на основе IP, где трафикс одного и того же IP-адреса предпочтет тот же сервер, но это все равно что бросает вызов всей вашей прекрасной архитектуре балансировки нагрузки: -)

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