Как снизить нагрузку на серверы в пиковые моменты продаж: что учитывать при проектировании архитектуры сайта
Бывает так, что компания готовится к масштабной распродаже, например к «чёрной пятнице», а сайт ложится в день акции, и бизнес теряет деньги. Так происходит, потому что сайт не выдерживает нагрузку. Разбираемся, что с этим делать и как подготовиться к следующему наплыву трафика.
Почему сайт не выдерживает нагрузку
Любой сайт не выдерживает нагрузку из-за одной и той же проблемы — трафика приходит больше, чем ресурс готов выдержать. И у этой проблемы есть свои причины:
- Неравномерно распределённый трафик. Например, когда в компании проводят разные маркетинговые активности в одно время: отправляют рассылки с призывом перейти на сайт и раздают промокоды покупателям в соцсетях. При таком условии за пару часов на сайт заходит столько посетителей, сколько не бывает за месяц. Тогда разработчикам нужно общаться с отделом маркетинга и искать решение проблемы. В нашей работе был такой кейс — расскажем о нём подробнее дальше в этой статье.
- Плохо написанный код. Проблемы в коде могут быть разные, и вот одна из них — не используется кеш, например если разработчик интернет-магазина не кеширует список городов, в которые доставляются заказы, хотя список меняется редко и его можно закешировать надолго. Ещё как вариант — неоптимальная работа с базами данных, например когда разработчик делает запросы к базе в цикле, вместо того чтобы получать данные одним запросом, или когда в таблицах нет индексов, из-за чего поиск нужных записей занимает больше времени, чем должен. Всё это замедляет работу сайта, а в пиковые моменты может привести к его полной недоступности.
- Проблемы с инфраструктурой. Проблемы такие же разные, как и в коде, например недостаточная мощность серверов. Мы всегда действуем по ситуации. Например, у одного нашего клиента не использовался отдельный сервер под фоновые задачи сайта (генерация отчётов, обработка данных и другие действия, которые не видит клиент). Клиент не выделял сервер осознанно, потому что покупать отдельный сервер дорого. Тогда мы предложили простое и дешёвое решение — очередь задач через RabbitMQ (о нём подробнее ниже).
Как исправить проблемы и подготовиться к следующему наплыву трафика
Первым делом нужно провести нагрузочное тестирование. С его помощью вы узнаете, какой трафик может выдержать сайт.
Нагрузочное тестирование — это способ проверить, как сайт, приложение или сервис работают при высокой нагрузке. При тестировании имитируют большое количество пользователей, которые заходят на сайт, ищут товары, оформляют заказы и отправляют запросы как настоящие люди.
Нагрузочное тестирование поможет узнать, сможет ли сайт выдержать ожидаемый трафик, например 10 тысяч человек онлайн. Если проверка показывает, что платформа не рассчитана на такую нагрузку, мы анализируем слабые места и решаем проблему:
- Изучаем код. Как мы и указали выше, проблемы в коде могут быть разные — от неоптимизированных запросов в базе данных до отсутствия кеширования.
- Пересматриваем архитектуру сайта. Чаще всего мы сталкиваемся с двумя проблемами. Первая — трафик идёт через один сервер, хотя можно распределить нагрузку. Вторая — все заказы обрабатываются синхронно, а не по очереди, что может блокировать дальнейшие действия пользователя, пока не получен ответ. Например, при оформлении заказа система может сразу передавать данные в «1С» для списания остатков. Если этот процесс выполняется синхронно, пользователь будет вынужден ждать. Оптимальное решение здесь — обрабатывать такие задачи фоново. Тогда заказ оформится мгновенно, а передача данных и списание остатков произойдут асинхронно, не создавая задержек.
- Проверяем серверы. Мы анализируем, какие ресурсы перегружены, и настраиваем мониторинг — систему, которая автоматически показывает, где проблема.
- Изучаем метрики. Мы смотрим показатели работы сервера, базы данных и анализируем отчёты по результатам нагрузочного тестирования, чтобы понять, где проблема и что тормозит сайт.
Но бывает и так, что подготовка не помогает. Например, если систему готовили к одному количеству трафика, а на деле пришло ещё больше посетителей. Тогда нужно действовать по ситуации: повесить на сайт заглушку или отключить фоновые задачи. Единого правильного плана нет — всё индивидуально. Поэтому важно, чтобы разработчики постоянно поддерживали сайт и могли решить проблему при наплыве трафика.
Как повысить отказоустойчивость платформ: лучшие технологии по версии ADV
Отказоустойчивость — это способность платформы работать без сбоев, даже если часть системы выходит из строя. Мы собрали минимальный набор технологий, который нужен для нормальной работы сайта.
- Rabbit MQ — система очереди сообщений, которая позволяет разделить взаимодействие между системами, чтобы оно было асинхронным. Очередь помогает разным частям приложения обмениваться данными в несколько потоков и распределять нагрузку.
- ElasticSearch — движок для поиска и хранения товаров. С помощью этой системы автоматически исправляются ошибки и опечатки пользователей при поиске, выполняется фильтрация товаров. Система хорошо справляется с большими объёмами данных и высокими нагрузками.
- JMeter — инструмент для нагрузочного тестирования. Он помогает проверить, как сайт ведёт себя под нагрузкой. Инструмент имитирует тысячи пользователей, позволяя увидеть слабые места и оценить, выдержит ли система ожидаемый трафик.
При правильном использовании этих технологий можно спокойно выходить в распродажи, акции и другие активности, которые подразумевают наплыв посетителей. Но не забывайте о том, что, кроме технических причин, существуют и внутренние, которые зависят от особенностей бизнеса. Иногда достаточно пересмотреть маркетинговую стратегию, вместо того чтобы искать ошибки в коде. Приводим в пример два кейса наших клиентов.
Как мы помогли бренду блогера распределить нагрузку на интернет-магазин
Проблема
У одного из наших клиентов, блогера, был свой интернет-магазин косметики. На сайт привлекали покупателей через розыгрыши, лотереи и рассылки. В период маркетинговых активностей в магазин заходило столько посетителей, сколько не было за месяц. Из-за этого сайт не справлялся с нагрузкой и бизнес терял деньги.
Решение
Мы проделали большую работу: оптимизировали запросы к базе данных, хранение товаров в ElasticSearch, использование кеша и кластера серверов и базы данных. Но это не решило проблему с неравномерным распределением трафика: код был здесь ни при чём. Тогда мы поговорили с отделом маркетинга и вместе приняли решение не проводить все активности в одно время. После этого рассылки, розыгрыши и лотереи маркетологи распределили равномерно. Например, email-рассылки делали за неделю до акции, а лотереи проводили в день акции. Равномерное распределение помогло без затрат наладить работу сайта в пиковые моменты продаж.
Как в MIXIT пришёл неожиданный большой трафик и что мы с ним делали
Проблема
В 2019 году во время пандемии сильно вырос спрос на маски и антисептики. В начале COVID-19 мало у кого были эти товары, а у MIXIT маски и антисептики продавались давно. Из-за этого пришёл большой неожиданный трафик, с которым сервис не справился.
Решение
Здесь мы тоже придумали решение, которое без серьёзных затрат восстановило работу интернет-магазина. Мы предложили ввести промокоды — скидки на покупку товаров ночью. В результате бизнес распределил трафик, а покупатель сэкономил.
Кейсы показывают, что сайт должны поддерживать 24/7, поэтому мы мониторим состояние проекта и отслеживаем нагрузку, чтобы ничего не упало. А ещё мы заранее видим проблемы с нагрузками и реагируем на них до наплыва трафика.