Кирпичи для интернета: топ‑10 концепций современной веб‑архитектуры, которые вам точно нужно знать
Опытный разработчик рассказывает о десяти китах, на которых построена архитектура современного веба.
Фото: Bloomberg / Getty Images
Шалита Суранга
(Shalitha Suranga)
Об авторе
Программист, создатель Neutralinojs — фреймворка для разработки JS-, HTML- и CSS-приложений, постоянный автор статей о технологиях на Medium.
Переводчик
Екатерина Степанова
С тех пор как Тим Бернерс-Ли изобрёл World Wide Web, в облачную экосистему перешли чуть ли не все типы физических сервисов. Число веб-сайтов и веб-приложений начало расти как на дрожжах — и в архитектуре каждого современного веб-приложения есть общие компоненты облачных вычислений, которые нужно знать каждому разработчику. Провайдеры облачных сервисов могут по-разному называть эти компоненты, но их суть остаётся прежней.
Я изучил архитектуры веб-приложений нескольких современных IT-гигантов (Netflix, Medium и Airbnb) и выделил в них такие составляющие:
1. Сервер
Сервером называют компьютер, который предоставляет какой-то сервис (или несколько сервисов) в частной сети или интернете. Другие устройства — их ещё называют клиентами — могут подключаться к серверу через разные порты, чтобы получить этот сервис. Серверы обычно называют по имени сервиса, который они предоставляют. Например, если сервер принимает запросы через 80-й порт и отдаёт клиентам веб-страницы, такой сервер обычно называют веб-сервером. Также существуют файловые серверы, почтовые серверы, серверы аутентификации, серверы баз данных, серверы приложений и тому подобные.
Сейчас более популярны виртуальные, а не физические серверы. Поставщики облачных услуг создают виртуальные машины поверх своего физического оборудования с помощью гипервизоров и программного обеспечения для виртуализации. Например, некоторые популярные провайдеры используют для создания своих виртуальных машин гипервизор Xen первого типа.
2. Клиент
Клиент — это устройство, которое подключается к серверам, чтобы пользоваться их сервисами или ресурсами. Клиентом может быть компьютер, веб-сайт, ПО или встроенная система. Например, когда вы заходите на веб-сайт, ваш браузер становится клиентом. По аналогии с именованием серверов, клиенты тоже называются в зависимости от сервиса, которым они пользуются: бывают email-клиенты, веб-клиенты, клиенты баз данных или клиенты онлайн-чатов.
В клиент-серверной модели используются методы вроде аутентификации, чтобы открыть конкретный сервис только отдельным клиентам. Клиенты бывают тонкими и толстыми. Тонкий клиент полностью зависит от сервера, как обычное одностраничное приложение (SPA — Single Page Application). Толстый же клиент от сервера не зависит. Он похож на автономное приложение, которое сохраняет данные на сервере.
3. Микросервис
Монолитная клиент-серверная архитектура не лишена недостатков. Сбои в монолитных системах влияют на всю систему, а сопровождать их довольно сложно. При микросервисном подходе разработчики разбивают большую монолитную систему на небольшие сервисы — микросервисы. Так называют слабосвязанный изолированный сервис, отвечающий за какой-то процесс.
Если вы разрабатываете систему управления пользователями, микросервисы могут отвечать за регистрацию пользователей, генерацию отчёта и процесс оплаты. В реальных веб-ориентированных системах большинство микросервисов представляют собой RESTful API, работающие на виртуальной машине или в контейнере.
Примечание переводчика
REST (англ. REpresentational State Transfer — «передача репрезентативного состояния» или «передача „самоописываемого“ состояния») — архитектурный стиль, набор принципов, по которому должны взаимодействовать компоненты распределённого приложения. Если система, веб-служба, API соответствует этим принципам, она называется RESTful.
Рой Филдинг (Roy Thomas Fielding) — американский учёный, автор термина REST, предложил шесть принципов REST-архитектуры, среди которых клиент-серверная модель, кэширование, отсутствие состояния и другие.
4. Облачная функция
С возрастанием сложности кода микросервисы могут становиться более тяжёлыми и сложными для поддержки. Кроме того, могут резко вырасти затраты на инфраструктуру, так как микросервисы будут постоянно ждать подключения клиентов к виртуальным машинам или контейнерам. Бессерверная (serverless) концепция позволяет разбить большие системы на более мелкие и удобные для поддержки функции — так называемые бессерверные, или облачные, функции.
5. Балансировщик нагрузки
Балансировкой нагрузки называют её распределение между разными вычислительными модулями. В веб‑архитектуре балансировщик нагрузки — это компонент, который перенаправляет трафик на разные серверы в зависимости от их доступности.
Есть два основных типа балансировщиков нагрузки: аппаратные (HLB — hardware‑based load balancer) и программные (software‑based). Популярнее программные, потому что HLB дорогие и для них нужны физические серверы.
Почти все поставщики облачных сервисов предлагают балансировщики нагрузки по модели «как услуга» (as-a-service).
6. API-шлюз (API gateway)
У веб-приложения может быть несколько API, и каждый нужно защитить от избыточной загрузки с помощью ограничения скорости обработки запросов (rate limiting). API-шлюз предоставляет единственную точку доступа для нескольких API и других сервисов.
Принцип его работы схож с принципом работы балансировщика нагрузки: он перенаправляет каждый клиентский запрос соответствующим сервисам. API-шлюз обычно предоставляется как часть решения по управлению API (API management solution), в которое также входит графический пользовательский интерфейс (GUI) для управления API с защищённой панели администратора.
В API-шлюзы встраивают службы мониторинга API, ограничения скорости обработки запросов, монетизации API и версионирования. Обычно API-шлюзы используются с RESTful API, но могут поддерживать протоколы SOAP, GraphQL, gRPC и TCP.
7. Очередь сообщений
Современная веб-архитектура складывается из отдельных управляемых компонентов — микросервисов. Микросервисы используют для взаимодействия друг с другом RESTful API или очереди сообщений. Очереди сообщений организуют асинхронный канал обмена сообщениями между двумя микросервисами по типу «издатель — подписчик» (pub-sub).
У очередей сообщений есть несколько преимуществ перед асинхронными RESTful-интерфейсами. Например, если во время REST-запроса происходит ошибка, инициатор запроса (клиент) должен суметь её обработать. Кроме того, некорректное REST-сообщение будет просто отклонено и никуда не сохранится. А вот очереди сообщений хранят все сообщения.
Даже если сообщение отправят в момент сбоя получателя, тот всё же получит его после перезапуска. Поэтому веб-архитекторы отдают предпочтение очередям сообщений в тех случаях, когда надёжность транзакций имеет решающее значение.
8. CDN
Сеть доставки контента (Content Delivery Network, CDN) состоит из географически распределённых серверов, которые кэшируют статический контент (например, рисунки или скрипты. — Пер.) для улучшения производительности, доступности и безопасности веб-приложений.
В типовом веб-приложении обычно есть рисунки, видео, стили и файлы JavaScript. Каждый раз, когда пользователь заходит в ваше приложение, его браузер скачивает эти ресурсы с сервера. Если пользователь живёт далеко от физического месторасположения сервера, страница будет загружаться долго. CDN кэширует статический контент на множестве серверов по всему миру и быстро доставляет его географически более близким клиентам.
Более того, CDN может смягчить ущерб от DDoS-атак, так как серверы кэширования CDN, по сути, выступают как прокси для вашего оригинального сервера.
Примечание переводчика
Атака типа «отказ в обслуживании» (DoS, Denial of Service) — попытка сделать недоступным сайт, веб‑приложение, систему. Часто при этом генерируется много запросов, которые в итоге перегружают систему. DDoS (Distributed DoS — в пер. с англ. — распределённая) — это когда атака ведётся одновременно из нескольких источников.
CDN при этой атаке становится дополнительным барьером — закрывает целевые компьютеры от прямого воздействия злоумышленников.
9. База данных
База данных — это компонент, в котором хранятся сведения различных типов. Есть разные типы баз данных: SQL, облачные, «ключ — значение» (key-value), графовые и иерархические (documented). Серверы баз данных позволяют клиентам взаимодействовать с базами данных по специальным протоколам. Например, сервер базы данных MySQL использует протокол MySQL.
Тип базы данных выбирают веб-архитекторы, исходя из реальных требований. Например, если нужно хранить много пользовательских сессий с уникальными идентификаторами, хорошим выбором будет база данных типа «ключ — значение».
10. Сервисы
Веб-приложениям необходимы аутентификация, обмен электронными письмами, логирование, мониторинг, машинное обучение, система платежей и другие сервисы. Кроме того, им нужны службы, связанные с разработкой, проектированием и развёртыванием, такие как хостинг репозиториев, непрерывная интеграция/доставка (CI/CD), база данных, хостинг приложений, поиск/индексирование и тому подобное. Ключевые требования для этих сервисов можно реализовать с помощью многих опенсорсных фреймворков. Но всё равно понадобится инфраструктура, чтобы установить и использовать эти сервисы.
Многие компании и стартапы, работающие по модели «как услуга» (as-a-service), предоставляют почти все эти облачные сервисы для веб-разработки. Кроме того, некоторые крупные технологические компании создали собственные экосистемы для разработки, в которых объединили множество облачных сервисов.