register

Разработка высоконагруженных сайтов

Часто разработка высоконагруженных сайтов по всем признакам проходит идеально: код функционала написан, запуск состоялся в срок, заказчик доволен. Но как только на сайт приходят живые пользователи, сервер начинает тормозить, а в пиковые часы и вовсе зависает. Это приводит к финансовым и репутационным потерям для бизнеса. В статье расскажем, почему так происходит и как минимизировать подобные риски.

Падение сайтов: последствия для бизнеса

Международный опрос от Statista показал, что 86% компаний теряет более 300 тысяч долларов в виде убытков и недополученной прибыли каждый час, пока их сайт недоступен.

Потолок потерь ограничен только масштабом бизнеса. Поэтому крупные корпорации теряют больше всего. Например, авиаперевозчик Delta Airlines понес убытки в 150 млн долларов за 5 часов, когда сайт был недоступен. Антирекорд же принадлежит Амазону. В день распродаж в 2018 году компания потеряла 99 млн долларов за один час.

Почему сайты не справляются с нагрузкой

Все интернет-системы рассчитаны на определенный порог нагрузки. Когда он превышен, сервер начинает подвисать, а затем и вовсе падает. Пользователь в таком случае видит вместо сайта экран с номером ошибки (500, 501, 502, 503 или 408).

Но приложение падает не из-за того, что все ее компоненты загружены на 100%. У любой системы есть узкое место или боттлнек (англ. «бутылочное горлышко»).

Что такое узкое место интернет-приложения

Представьте 3-полосную трассу, где случилась авария и одна из полос перекрыта на небольшом участке. Из-за одного узкого места такая 3-полосная магистраль пропускает столько же машин, сколько и 2-полосная.

Приложения также могут состоять из компонентов с разной пропускной способностью. Для сайтов она измеряется в одновременных запросах. Если 9 из 10 модулей сайта могут обрабатывать 100 запросов, но один модуль способен справиться лишь с 30, то общая производительность равна именно 30.

Слабым звеном может выступать процессор, память, жесткий диск, интернет-соединение или элемент ПО. Например, распространенная проблема сайтов на Вордпресс – неэффективная работа с базой данных. Она начинает проявляться по мере роста трафика на сайт. Поэтому крупные проекты, как правило, не строят на шаблонных платформах.

Разработка высоконагруженных сайтов: пошаговый план

Есть мнение, что для начала достаточно запустить простенький сайт, а когда пойдет поток посетителей, систему всегда можно будет дооптимизировать. Но на практике дорабатывать приложение на ходу бывает сложнее, чем переписать его заново. Это приведет к тому, что пока происходит апгрейд – а это как минимум полгода – бизнес теряет потенциальных клиентов.

Мы составили пошаговый план, который поможет вам не допустить такую ситуацию при разработке highload-сайта.

Шаг №1. Прогноз пиковой нагрузки

Создание высоконагруженного проекта начинается с прогнозирования пиковой нагрузки. Сделать это можно двумя способами:

  1. Исходя из бизнес-плана заказчика и особенностей ниши, оценить, сколько людей может посетить сайт в час пик. При этом посетители, которые просто находятся на странице, не используют ресурсы системы. Поэтому нужно рассчитать, какая доля из них будет совершать запросы в один момент времени – т. е. не просто изучать содержимое страницы, а переходить по внутренним ссылкам, использовать интерактивные функции и т. д. Для этого составляются User Stories – модели поведения пользователей на сайте.
    Пример. В пиковый час на сайт заходит 1 тыс. человек. При этом одновременно запросы совершает 10%. Получается, сайт должен выдерживать 100 одновременных запросов.
  2. Также можно протестировать, какую нагрузку выдерживают сайты конкурентов. Это делается с помощью специализированных инструментов. Например, мы используем сервис Loadview.
    Число одновременных запросов, которое сайт должен выдержать, закрепляется в договоре.

Шаг №2. Планирование

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

В больших IT-компаниях этим занимается Software Architect – архитектор ПО. В студиях поменьше нет штатных архитекторов. Поэтому эта обязанность ложится на разработчика с наибольшим опытом, например, тимлида или старшего программиста.

Шаг №3. Выбор технологий

На старте также нужно определиться со стеком технологий проекта. И ключевую роль здесь играет язык программирования.

Некоторые языки были изобретены специально для высоконагруженных проектов, среди них GO и Rust. Но, кроме этого, есть языки, которые взяли тренд на адаптацию под хайлоад (англ. “высокая нагрузка”). Среди них и Python, на котором пишем мы.

Пять лет назад Python взял курс на асинхронность – параллельное выполнение задач. Асинхронность позволяет избежать ситуации, когда один тяжелый запрос задерживает работу программы целиком. Это особенно актуально для высоконагруженных проектов. А благодаря высокой читабельности Питона разработчикам удобно поддерживать и улучшать массивную кодовую базу высоконагруженных программ.

Шаг №4. Оптимизация нагрузки

Балансировка по серверам

Нагрузку можно распределить на несколько компьютеров (серверов). А специальный алгоритм будет направлять запрос пользователя на наименее загруженный сервер. Так достигается выравнивание нагрузки и повышение отказоустойчивости сайта.

Вынос части приложения на отдельный сервер

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

Выбор архитектуры

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

Рассмотрим два сценария, когда уместны разные архитектуры.

  1. Приложение с несколькими ключевыми функциями и рядом второстепенных. В этом случае имеет смысл разместить основные функции в микроядре, а второстепенные фичи реализовать в виде плагинов. Пример: браузер Хром с его расширениями.
  2. Приложение с разнородными востребованными функциями, у каждой функции пики спроса приходятся на разное время и масштабирование должно проходить отдельно. Здесь лучшим архитектурным решением будет использование микросервисов – маленьких программ внутри общего проекта. Пример: Amazon, объединяющий массу разнообразных услуг на одной платформе.

Заложите возможность масштабирования в инфраструктуру

Масштабировать приложение можно за счет инвестиции в оборудование. Подключение новых серверов называют горизонтальным масштабированием. А увеличение мощности одного сервера – вертикальным.

Большинство хостингов дает возможность дозакупки новых ресурсов и апгрейда тарифного плана, вплоть до аренды собственного сервера. Для самых крупных проектов оптимальный вариант – облачные платформы с автомасштабируемыми серверами. Они позволяют подключать на ходу практически неограниченные ресурсы. Наиболее известные платформы на рынке: Amazon AWS, Google Cloud и Microsoft Azure.

Специализированные библиотеки

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

Кэширование

Некоторые объекты на сайтах дублируются из страницы в страницу и редко изменяются. Их называют статикой. К ней могут относиться картинки, Javascript, CSS и файлы для загрузки. Такие материалы можно кэшировать – сохранить для отдачи на специальном сервере или в браузере пользователей. Так мы снимем нагрузку с основного сервера.

CDN

CDN-сервисы – это сети серверов, распределенные по разным регионам. Они выполняют три важных функции:

  1. Автоматически кэшируют контент на своих серверах, снимая нагрузку с вашей системы.
  2. Раздают кэш с ближайшего для пользователя дата-центра, что ускоряет запросы между браузером и сервером.
  3. Защищают сайт от спамеров, хакеров и ботов.

Существует много надежных CDN-провайдеров, к примеру: StackPath, Securi, Amazon CloudFront, Cloudflare. Последний чаще всего используется в наших проектах.

Шаг №5. Стресс-тесты

В процессе разработки высоконагруженных проектов и на финальной стадии обязательно проводятся стресс-тесты. Так проверяется, сколько одновременных запросов может выдержать каждая страница сайта. С этой целью в нашей компании используются такие инструменты, как wrk, apache benchmark и locust.

Для страниц, которые провалили тест и не выдерживают заявленную нагрузку, проводится анализ всех функций отдельно. Для этого существуют специальные библиотеки. Для Python – это cprofile.

Мониторинг

После запуска хайлоад-сайта нужно непрерывно отслеживать его производительность.

Упомянутые ранее облачные платформы предоставляют для этого готовые инструменты. Например, продвинутые мониторы производительности приложений (APS). А для оперативного устранения багов также важно внедрить постоянное логирование.

Как выбрать подрядчика для высоконагруженного проекта

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

  • наличие штатных технических специалистов;
  • компетентность разработчиков, наличие узких специалистов (архитекторов ПО, фронтенд и бэкенд разработчиков, QA-инженеров);
  • рейтинги и отзывы о компании на независимых площадках (Clutch, LinkedIn, DOU).

Также вы можете заказать разработку высоконагруженного приложения у нас. Свяжитесь с нами по контактам на сайте, и мы обсудим вашу идею.

Примеры работ

Мы специализируемся на:

Факты о WEBCASE

Последние публикации

Спасибо за ваш интерес!

Мы с вами свяжемся в ближайшее время