Как крупные веб-сайты, которые не могут быть полностью без состояний, достигают максимальной масштабируемости на веб-уровне?
Существуют такие сайты, как eBay и Amazon, которые не могут быть полностью безлимитными, поскольку у них есть корзина для покупок или что-то в этом роде. Невозможно закодировать каждый элемент в корзине для покупок в URL-адрес, а также невозможно кодировать каждый элемент в файл cookie и отправлять его при каждом подключении. Таким образом, Amazon просто сохраняет идентификатор сессии в файле cookie, который отправляется. Поэтому я понимаю, что масштабируемость веб-уровня eBay и Amazon должна быть намного сложнее, чем масштабируемость поисковой системы Google, где все может быть закодировано в виде URL-адреса.
С другой стороны, как eBay, так и Amazon масштабируются абсолютно. Ходят слухи, что на eBay есть около 15000 серверов приложений J2EE.
Как эти сайты работают как с высокой масштабируемостью, так и с сохранением состояния? Поскольку сайт находится в состоянии отслеживания, невозможно выполнить простую балансировку DNS. Таким образом, можно предположить, что в этих компаниях есть аппаратный балансировщик нагрузки, такой как BigIP, Netscaler или что-то в этом роде, которое является единственным устройством, поддерживающим один IP-адрес этого сайта. Этот балансировщик нагрузки расшифровывает SSL (если он закодирован), проверяет cookie и в зависимости от идентификатора сеанса этого cookie определяет, какой сервер приложений содержит сеанс этого клиента.
Но это просто не может сработать, поскольку ни один балансировщик нагрузки не может справиться с нагрузкой тысяч серверов приложений? Я полагаю, что даже эти аппаратные балансировщики нагрузки не масштабируются до такого уровня.
Кроме того, распределение нагрузки выполняется прозрачно для пользователя, то есть пользователи не перенаправляются на разные адреса, но все вместе все время остаются на www.amazon.com.
Итак, мой вопрос: существует ли какой-то особый прием, с помощью которого можно добиться чего-то вроде прозрачного шардинга веб-уровня (не уровня базы данных, как это обычно делается)? Пока cookie не проверяется, невозможно узнать, какой сервер приложений удерживает этот сеанс.
Редактировать: Я понял, что нужна только прозрачность, если нужно, чтобы сайт был добавлен в закладки и добавлен в закладки. Например. если сайт представляет собой простое веб-приложение, что-то вроде системы бронирования билетов на самолет или поезд, не должно быть проблем с простым перенаправлением пользователей на конкретные кластеры веб-серверов за разными URL-адресами, например a17.ticketreservation.com. В этом конкретном случае было бы целесообразно просто использовать несколько кластеров серверов приложений, каждый из которых имеет собственный балансировщик нагрузки.
Интересно, что я не нашел сайт, который использует такую концепцию.
Редактировать: Я нашел эту концепцию обсуждается на highscalability.com , где обсуждение относится к статье Лей Чжу под названием "Клиентская сторона Балансировка нагрузки для приложений Web 2.0 ". Лей Чжу использует кросс-сценарии для прозрачного распределения нагрузки на стороне клиента.
Даже если есть недостатки, такие как закладки, xss и т. Д., Я думаю, что это звучит как очень хорошая идея для определенных особых ситуаций, а именно веб-приложений, практически не содержащих контента, которые не нужно разбрасывать или добавлять в закладки ( например, системы бронирования билетов или что-то подобное). Тогда нет необходимости выполнять прозрачную балансировку нагрузки.
Может быть простое перенаправление с основного сайта на сервер, например перенаправление с www.ticketreservation.com на a17.ticketreservation.com. С этого момента пользователь остается на сервере a17. a17 - это не сервер, а сам кластер, с помощью которого можно достичь избыточности.
Первоначальный сервер перенаправления мог сам по себе быть кластером за балансировщиком нагрузки. Таким образом, можно достичь действительно высокой масштабируемости, поскольку основной балансировщик нагрузки после www срабатывает только один раз в начале каждого сеанса.
Конечно, перенаправление на разные URL выглядит крайне неприятно, но с простыми веб-приложениями (которые в любом случае не нужно разбрасывать, добавлять ссылки или делать закладки), это должно быть только оптической проблемой для пользователя?
Кластер перенаправления может опрашивать нагрузку кластеров приложений и соответствующим образом адаптировать перенаправления, обеспечивая таким образом балансировку, а не просто распределение нагрузки.