Фон:
Веб-сайт электронной коммерции на базе Asp.net 4.0. Размещено в облаке с выделенным SQL Server 2008 Standard (16 ядер) с 32 ГБ ОЗУ.
Взаимодействие с пользователем:
- Пользователи посещают веб-сайт.
- просматривать различные категории (пока нет статического контента)
- положить товар в корзину
- Таймер тикает до 15 минут.
- Проверить
- Войти/Создать аккаунт
- Платеж проходит через шлюз Authorize.Net (пользователь остается на нашем сайте)
- Электронные письма отправляются после регистрации/забытого пароля/завершения заказа с использованием стороннего SMTP-провайдера.
Примечание: Наличие билетов проверяется при загрузке страницы товара и при помещении их в корзину. Как только у них есть товар в корзине, таймер наверняка отсчитывает 15 минут. Запрос базы данных каждые 25 секунд для обновления таймера.
Инцидент:
Хорошо, ребята, на прошлой неделе у нас была огромная распродажа, наверное, около 10 000 билетов были выставлены на продажу для фанатов по всей Америке. Мы видели трафик, когда он вышел из-под контроля, и в течение 2-4 часов мы видели, что на нашем сайте было около 1000 одновременных пользователей.
Проблема:
Проблема заключалась в том, что у нас было около 6 облачных серверов по 2 ГБ, которые быстро заполнялись, а затем зависали из-за огромного трафика. Затем нам пришлось раскрутить серверы на 4 Гб, 8 Гб и 16 Гб (по 2 каждый), чтобы справиться с трафиком. во время периода сбоя, который длился около 15-20 минут, веб-сайт перестал отвечать, а также мы увидели, что база данных (выделенная) использует 100% ЦП.
- gb - объем оперативной памяти серверов.
Каркас:
Код .net написан очень эффективно, он выполняет всего два оператора SQL для получения и построения всех необходимых данных, которые необходимо отобразить в браузере. Вся бизнес-логика, связанная с базой данных, написана в хранимых процедурах. Никаких курсоров, никакого динамического sql в хранимой процедуре.
Необходимые:
Я не могу понять, почему веб-сайт дает сбой... У меня есть множество инструментов анализа кода, которые постоянно сообщают нам, какая часть кода занимает слишком много времени или какой запрос занимает так много времени. Когда у нас большие серверы (8 Гб и более), сайт работает без сбоев.
Должен ли я избавиться от необходимости забивать базу данных при каждой загрузке страницы? Как насчет статических страниц? (хотя нам нужно будет экспортировать информацию о продуктах в html, что нормально).
Что если я сохраню страницы в индексе Lucene.Net? а потом рендерить из него? Будет ли ввод-вывод стоить дорого в этом сценарии?
Я действительно хочу получить экспертное мнение о том, как решить эту проблему? Изначально мы планировали иметь дело с 25 тысячами одновременных пользователей, но мы видим, что для этого нам потребуется много больших облачных серверов.
Спасибо