УДК 004

Современная архитектура веб-приложений

Шершень Кирилл Викторович – старший инженер-программист, бэкэнд разработчик ROKO labs LLC Turkey.

Аннотация: Данная статья призвана стать вашим надежным путеводителем в мир архитектуры веб-приложений. Мы рассмотрим основы этой сложной области, проанализируем ключевые компоненты веб-приложений и выявим, почему выбор архитектуры - это неотъемлемый этап, который требует вашего внимания. Будут представлены современные и проверенные временем типы архитектуры, а также мы погрузимся в бизнес-кейсы и лучшие практики использования различных архитектурных подходов, подкрепленные примерами из реального опыта.

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

Ключевые слова: backend, ПО, IT, разработка сайтов, архитектура ПО, облачные сервисы, программирование.

Что собой представляет архитектура веб-приложений?

Архитектура веб-приложений представляет собой систематический подход к организации компонентов приложения, направленный на определение их взаимодействия и внутреннюю структуру с целью обеспечения эффективной разработки, масштабирования и поддержки. Эта методология включает разделение функциональности на различные слои, такие как фронтенд (отвечающий за пользовательский интерфейс), бэкенд (обрабатывающий бизнес-логику и взаимодействие с базой данных), базу данных (хранящую и управляющую данными), а также другие сервисы и компоненты, обеспечивающие необходимую функциональность приложения [1]. Основная цель архитектуры веб-приложений – создать устойчивую, гибкую и легко поддерживаемую основу для функционирования веб-приложения, при этом обеспечивая высокую производительность и безопасность.

Компоненты архитектуры современных веб-приложений

Архитектура веб-приложений – это организованная структура, объединяющая различные взаимосвязанные компоненты в единую систему [2]. Эти элементы играют ключевую роль в формировании веб-приложения, обеспечивая его масштабируемость, эффективность и безопасность. Осознание взаимосвязи между ними является фундаментальным аспектом разработки надежных и производительных веб-приложений. Ниже представлена подробная схема взаимодействия компонентов архитектуры веб-приложений, не смотря на всю массивную схему всё сводится в систему клиент-серверного взаимодействия. Остановимся подробнее на каждом из них, схема представлена на рисунке 1.

Рисунок1

Рисунок 1. Схема взаимодействия компонентов архитектуры веб-приложений

DNS (№1)

Для установления связи с веб-серверами браузерам необходимы IP-адреса. DNS облегчает этот процесс, позволяя пользователям использовать удобочитаемые имена вместо сложных числовых значений. DNS можно представить как интернет-каталог контактов, упрощающий процесс подключения к ресурсам с использованием понятных и легко запоминающихся имен.

Веб-сервер и Сервер приложений

В мире веб-разработки, где все стремятся за динамичными и отзывчивыми приложениями, существует два важных игрока: веб-сервер и сервер приложений (рис. 2). Давайте подробно рассмотрим роли и функции веб-серверов и серверов приложений, чтобы лучше понять, как эти компоненты сотрудничают между собой.

Рисунок2

Рисунок 2. Схема взаимодействия веб-сервера и сервера приложений

Веб-сервер (Web Server №2a)

Веб-сервер обрабатывает запросы от клиентов (браузеров) и отвечает на них, обслуживая статические ресурсы, такие как HTML-страницы, изображения, CSS и JavaScript файлы. Основной акцент веб-сервера - на обработке статических данных. Он может отправлять файлы напрямую клиентам без необходимости выполнения сложной обработки на стороне сервера. Примерами являются Nginx, Apache, Microsoft IIS.

Сервер приложений (Application Server №3)

Сервер приложений предназначен для выполнения динамических приложений, обрабатывая бизнес-логику и взаимодействуя с базой данных. Он может выполнять сложные операции, такие как обработка запросов, работа с транзакциями и управление сеансами. Основной акцент сервера приложений - на выполнении динамического кода. Он может взаимодействовать с веб-сервером, чтобы получить статические ресурсы, но его главная задача - обрабатывать запросы, требующие вычислений или доступа к базе данных.

Предположим, у вас есть веб-приложение на Python. Сервер приложений, такой как Gunicorn или uWSGI, будет отвечать за выполнение кода вашего бэкенда, написанного на Python. Бэкенд взаимодействует с базой данных, обрабатывает бизнес-логику и предоставляет API для фронтенда. Фронтенд, в свою очередь, отправляет HTTP-запросы бэкенду через веб-сервер, который перенаправляет их на сервер приложений для обработки.

Очереди задач (№6a)

В сценариях, когда в нашем приложении есть операции, затрачивающие много времени, такие как массовая рассылка сообщений, обработка изображений, большие вычислительные задачи, нам приходят на помощь сервисы фоновых задач. Асинхронное выполнение этих операций с использованием сервисов фоновых задач позволяет избежать блокировки основного потока приложения и обеспечивает отзывчивость интерфейса. В качестве таких сервисов выступают Celery, а в качестве брокеров сообщений RabbitMQ, Redis, ActiveMQ. Сервера заданий (№6b) выполняют задания из очереди. Они запрашивают её, чтобы определить, есть ли работа, и если есть, — приступают к выполнению.

Масштабирование

Горизонтальное масштабирование веб-приложений представляет собой подход, при котором увеличение нагрузки обеспечивается добавлением дополнительных экземпляров (инстансов) веб-приложения, вместо увеличения мощности (вертикальное масштабирование) отдельного экземпляра[5]. Это позволяет более эффективно распределять нагрузку и повышает отказоустойчивость системы.

К инструментам горизонтального масштабирования можно отнести:

  • Балансировщики нагрузки (Load Balancers)
  • Контейнеризация и оркестрация

Балансировщики нагрузки (Load Balancers) (№2b)

У каждого сервера есть ограниченные объемы оперативной памяти и процессора, что может привести к проблемам с производительностью при значительном пользовательском трафике. В таких ситуациях балансировщики нагрузки выступают в роли решения [8].

Балансировщик нагрузки эффективно управляет потоком данных, равномерно распределяя его между веб-серверами в соответствии с их доступными вычислительными ресурсами. Этот процесс оптимизирует рабочую нагрузку, гарантируя бесперебойную функциональность веб-приложения. В качестве подсистемы балансировки может выступать Nginx, HAProxy, Amazon ELB (Elastic Load Balancer), Microsoft Azure Load Balancer.

Контейнеризация и оркестрация

Современное веб-приложение редко обходиться без использования средств контейнеризации, самая распространённая это Docker. Приложение оборачивается в контейнер и работает в изолированном окружении, благодаря чему, в зависимости от текущей нагрузки, можно добавлять новые экземпляры приложения в виде контейнера, если есть нагрузка и убирать запущенные экземпляры если нагрузки нет. За это отвечают инструменты оркестрации такие как Kubernetes, Docker Swarm, OpenShift, AWS ECS.

Базы данных (№4)

Базы данных представляют собой важный элемент архитектуры веб-приложений, выполняя ключевую роль в хранении, структурировании и управлении данными, необходимыми для эффективного функционирования приложения [3]. Выбор конкретной базы данных зависит от уникальных требований и характеристик конкретного приложения. Вот несколько типов баз данных и их применение в контексте компонентов веб-приложений:

Реляционные базы данных (RDBMS)

  • Применение: Хранение структурированных данных.
  • Обеспечение согласованности и целостности данных.
  • Поддержка транзакций.
  • Примеры: MySQL, PostgreSQL, Oracle, Microsoft SQL Server.

Нереляционные базы данных (NoSQL)

  • Применение: Хранение неструктурированных или полуструктурированных данных.
  • Обработка больших объемов данных и их гибкое масштабирование.
  • Возможность горизонтального масштабирования.
  • Примеры: MongoDB, Cassandra, CouchDB.

Колоночные базы данных

  • Применение: Обработка и хранение больших объемов данных, где требуется быстрый доступ к небольшому набору колонок.
  • Подходит для аналитических задач и хранения временных рядов данных.
  • Примеры: Сlickhouse, Apache Cassandra, Google Bigtable, Amazon DynamoDB.

Облачные хранилища

  • Применение: Хранение и управление статическими файлами, такими как изображения, видео и документы в веб-приложениях [9].
  • Интеграция с облачными сервисами для эффективной обработки и распределения контента.
  • Примеры: Amazon S3, Google Cloud Storage, Microsoft Azure Blob Storage.

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

Data Stream (№9a)

Data Stream позволяет серверу обрабатывать события в режиме реального времени. Например, при появлении нового заказа в интернет-магазине, сервер может использовать поток данных для мгновенного уведомления и обработки заказа. Это происходит за счёт того, что потребители данных сами узнают о новом заказе и поэтому не нужно уведомлять вручную каждый сервис. Программные продукты, такие как Apache Kafka или RabbitMQ, могут использоваться для управления потоками данных между различными компонентами веб-приложения. Все это улучшает слаженность системы.

Хранилище данных (№9b)

Хранилище данных предназначено для хранения и последующего анализа больших объемов данных. Распространенным примером является Redshift для пользователей AWS, который популярен среди стартапов. Ещё одним решением выступает ClickHouse, который использует колоночное хранение данных, что позволяет ему оптимально справляться с большими объемами информации. Здесь данные каждого столбца хранятся последовательно, обеспечивая быстрый доступ к необходимой информации при анализе.

Big Data

Для работы с BigData существуют отдельные сервисы, так как современные веб-приложения зачастую требуют большого объема данных для обработки и анализа. Такими сервисами могут быть Apache Hadoop, Apache Spark, Amazon EMR (Elastic MapReduce), Google Cloud Dataflow. Эти сервисы предоставляют разнообразные возможности для обработки, анализа и передачи больших объемов данных, что делает их важными компонентами в архитектуре систем работы с Big Data.

Служба кэширования (№5)

Сервисы кэширования сохраняют результаты предыдущих запросов, позволяя повторно использовать данные, вместо повторного выполнения вычислений или обращения к базе данных. Для реализации кэширования обычно используют Redis или Memchached в зависимости от задачи.

Сервис полнотекстового поиска (№7)

Допустим, у вас есть веб-приложение для электронной коммерции, и вам нужен эффективный механизм поиска товаров для пользователей. В этом случае сервис полнотекстового поиска может быть весьма полезным. Рассмотрим несколько примеров таких сервисов и их применение в современных веб-приложениях.

1) Elasticsearch

Представляет собой распределенный движок полнотекстового поиска, построенный на базе Apache Lucene. Он предоставляет высокопроизводительный и масштабируемый инструмент для индексации и поиска текстовых данных. Вы создаете индекс Elasticsearch, представляющий собой структурированный набор данных, связанных с товарами в вашем каталоге.

2) Apache Solr

Solr - еще один мощный поисковой сервер, основанный на Apache Lucene. Он предоставляет возможности полнотекстового поиска, фасетного поиска и расширенной индексации.

Логгирование

Логгирование играют важную роль в обеспечении стабильности, производительности и безопасности веб-приложений. В их компетенции собирать, хранить и анализировать различные виды данных, включая логи, ошибки и метрики. Примерами сервисов логов являются ELK, New Relic, Prometheus и Sentry.

CDN (Content Delivery Network) (№11)

Сеть доставки контента (CDN) — это сеть серверных узлов, которая хранит и обеспечивает передачу статического контента, такого как изображения, аудио, видео, файлы CSS и JavaScript. Использование CDN может сократить время задержки для пользователей, находящихся далеко от центров обработки данных, в которых размещено ваше веб-приложение [7].


Примеры CDN в Современных Веб-Приложениях:

  • Cloudflare: предоставляет глобальную CDN, улучшая производительность и безопасность веб-приложений. Особенностью Cloudflare является ускоренная загрузка контента, защита от атак.
  • Amazon CloudFront: Часть облачного сервиса Amazon Web Services, CloudFront обеспечивает быструю и надежную доставку контента.

Типы архитектуры веб-приложений

Имеется множество различных архитектур веб-приложений, каждая из них характеризуется своими преимуществами и недостатками.

К наиболее распространенным категориям относятся монолитная архитектура, микросервисы, прогрессивные веб-приложения и бессерверная архитектура [3]. Понимание их особенностей позволит принимать более обдуманные решения относительно выбора подхода для вашего веб-приложения. Быстро пробежимся по основным особенностям каждой из них.

  1. Монолитная архитектура (Классическая архитектура)

Одна из самых распространенных является монолитная архитектура, где все компоненты интегрированы в единое приложение (рис. 3). Этот метод прост в разработке и развертывании, однако с ростом приложения может усложниться в управлении и масштабировании [6].

Рисунок3

Рисунок 3. Монолитная архитектура

  1. Микросервисная архитектура

Микросервисная архитектура [4], напротив, разбивает приложение на небольшие, независимые сервисы, что обеспечивает большую гибкость и масштабируемость. Но такой подход требует более сложного управления и создания. (см. Рисунок 4)

Рисунок4

Рисунок 4. Микросервисная архитектура

  1. Бессерверная архитектура

Бессерверная архитектура, или Function-as-a-Service (FaaS), представляет современный подход, при котором облачные поставщики управляют основной инфраструктурой. Здесь разработчики создают функции, выполняющиеся в ответ на события без необходимости управления серверами или инфраструктурой. (см. Рисунок 5)

Рисунок5

Рисунок 5. Бессерверная архитектура

Заключение

Cовременные архитектуры веб-приложений предоставляют разработчикам множество вариантов для эффективного проектирования и развертывания приложений. Каждый компонент выполняет свою уникальную роль, создавая симфонию функциональности и производительности. С этой перспективы, серверы, базы данных и серверы приложений взаимодействуют как согласованный ансамбль, обеспечивая надежную работу веб-приложения.

При выборе архитектуры, каждый подход имеет свои особенности, которые могут быть адаптированы под конкретные требования проекта.

Монолитная архитектура — это надёжный стартовый двигатель для проектов, где простота и скорость разработки имеют первостепенное значение. В сценариях, где проект ещё молод или не требует сложных структур, монолит может выступить в роли эффективного строительного блока.

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

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

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

Список литературы

  1. Web Architecture Components – [Электронный ресурс]. – Режим доступа: https://www.peerbits.com/blog/web-application-architecture.html. – Дата доступа: 20.12.2023.
  2. Types of Web Application Architectures – [Электронный ресурс]. – Режим доступа: https://www.altexsoft.com/blog/web-application-architecture-how-the-web-works/. – Дата доступа: 20.12.2023.
  3. Kleppmann, Martin. "Designing Data-Intensive Applications." – [Электронный ресурс]. – Режим доступа: https://www.amazon.com/Designing-Data-Intensive-Applications-Martin-Kleppmann/dp/1449373321. – Дата доступа: 20.12.2023.
  4. Cambell Edward. "Microservices Architecture: Make the Architecture of a software as simple as possible." – [Электронный ресурс]. – Режим доступа: https://www.amazon.com/Microservices-Architecture-architecture-software-possible-ebook/dp/B00Y6MO1NK. – Дата доступа: 20.12.2023.
  5. Ousterhout, John "A Philosophy of Software Design." – [Электронный ресурс]. – Режим доступа: https://www.amazon.com/Philosophy-Software-Design-John-Ousterhout/dp/1732102201. – Дата доступа: 20.12.2023.
  6. Allamaraju, Subbu. "RESTful Web Services Cookbook: Solutions for Improving Scalability and Simplicity." – [Электронный ресурс]. – Режим доступа: https://www.amazon.com/RESTful-Services-Cookbook-Scalability-Simplicity/dp/0596801688. – Дата доступа: 20.12.2023.
  7. Lee, Atchison. " Architecting for Scale: High Availability for Your Growing Applications" – [Электронный ресурс]. – Режим доступа: https://www.goodreads.com/ru/book/show/27560189. – Дата доступа: 20.12.2023.
  8. Tilkov, Stefan. " REST und HTTP: Entwicklung und Integration nach dem Architekturstil des Web" – [Электронный ресурс]. – Режим доступа: https://www.amazon.de/gp/product/3864901200 – Дата доступа: 20.12.2023.
  9. Kavis, Michael "Architecting the Cloud: Design Decisions for Cloud Computing Service Models." – [Электронный ресурс]. – Режим доступа: https://onlinelibrary.wiley.com/doi/book/10.1002/9781118691779