Я недавно решила углубленно разобраться, какие архитектуры бывают в разработке ПО, и написать об этом простую статью. Это моя первая попытка поделиться своими мыслями и объяснить сложные вещи на понятном языке, поэтому буду рада вашей обратной связи!
Здесь я постаралась рассказать про монолиты, микросервисы и микрофронтенды без сложных терминов и технических деталей, чтобы те, кто только начинает разбираться в теме, могли понять, что к чему. Надеюсь, вам будет полезно и интересно. Поехали! ?
1. Монолитная архитектура ?
Что это?
Монолит — это когда всё в одном котле: и фронтенд, и бэкенд, и логика, и даже кофе-машина на сервере. Все компоненты тесно связаны, как студенты на паре в день экзамена.
Приложение — это один большой проект, где всё хранится в одном репозитории и запускается как единое целое.
Плюсы:
?️ Быстро начать: Можно сразу делать фичи и не думать о микросервисах. Например, добавили новую страницу — и она сразу заработала, потому что всё уже настроено.
? Простая разработка: Один репозиторий, одна сборка, меньше головной боли. Все данные и модули доступны без сложной настройки API или взаимодействия между сервисами.
Минусы:
? Масштабирование — боль: Как перевезти слона в чемодане? Никак. Например, если ваш проект растёт, и нужно отдельно масштабировать только часть (например, отчёты), придётся раздувать весь монолит.
? Сложность изменений: Чуть тронул один модуль — рухнул весь мир. Допустим, вы изменили обработку пользователей, и вдруг выяснилось, что это сломало авторизацию, которую вы даже не трогали.
Когда использовать?
Когда проект маленький, и вы не хотите писать 100 сервисов для вывода "Hello, World!".
Подходит для MVP и быстрых прототипов, где важна скорость запуска, а не масштабирование.
Когда команда маленькая, и нет смысла делить приложение на микросервисы.
2. Микросервисная архитектура ?
Что это?
Микросервисы — это когда каждый компонент живёт своей жизнью и не лезет в чужие дела. Например, у вас есть отдельный сервис для авторизации, отдельный для управления пользователями и ещё один для аналитики. Они взаимодействуют друг с другом через API.
Бэкендеры радуются, потому что можно писать разные части на Java, Go или Python. А вот фронтендеры иногда грустят: "опять нужно что-то соединять".
Плюсы:
? Легко масштабировать: Если вдруг сервис обработки заказов не справляется, вы просто добавляете ещё одну копию именно этого сервиса, не затрагивая остальные. Например, аналитика продолжает работать без изменений.
⚡ Гибкость: Разработчики из разных команд могут работать независимо. Например, одна команда пилит платежи на Java, другая занимается авторизацией на Node.js, и они друг другу не мешают.
Минусы:
? Интеграция: Это как подключать домашний кинотеатр: всё красиво, но звук почему-то идёт только из одной колонки. Например, если API между сервисами недоработано, данные могут теряться или передаваться с ошибками.
?️ Мониторинг: Найти ошибку в микросервисах — это как искать кота в тёмной комнате. Если что-то ломается, нужно отследить всю цепочку: какой сервис отправил неверные данные, где они застряли и кто виноват.
Когда использовать?
Когда проект большой, и каждая часть требует отдельного внимания. Например, интернет-магазин с системой рекомендаций, платёжным шлюзом и аналитикой.
Если проект рассчитан на масштабирование. Например, при росте нагрузки можно добавить копии только загруженных сервисов (вместо увеличения всего приложения).
Когда разные команды работают над отдельными частями, и нужно дать им больше свободы в выборе технологий.
3. Микрофронтенды ?
Что это?
Это как микросервисы, но на фронтенде. Каждый модуль — свой маленький проект. Например, страница каталога товаров, корзина и профиль пользователя могут быть отдельными модулями. Разные команды могут писать их на React, Angular или даже на Vanilla JS, если хотят повеселить будущих разработчиков.
Плюсы:
? Независимость: Один модуль сломался — остальные работают. Например, если упала страница рекомендаций, пользователь всё ещё может оформить заказ.
? Мультифреймворк: Можно использовать разные технологии для разных модулей, например, каталог на React, корзину на Vue, а профиль пользователя — на Angular. Главное, чтобы ваш тимлид не увидел это.
Минусы:
? Интеграция: "Почему мой компонент слева, а твой компонент внизу экрана?" Интеграция модулей может быть сложной, особенно если они используют разные подходы к стилям.
? Производительность: Страница может загружаться медленно из-за большого количества отдельных модулей. Например, если каждый из них подтягивает свои стили и скрипты.
Когда использовать?
Когда над проектом работают десятки команд, и каждая занимается своим модулем. Особенно полезно для больших интерфейсов, которые нужно обновлять по частям, без остановки всего приложения.
4. MVC (Model-View-Controller) ?
Что это?
MVC делит приложение на три части:
Model: "Дай данные". Это бизнес-логика и работа с базой данных.
View: "Покажу данные". Это интерфейс, который видит пользователь.
Controller: "Я тут всем руковожу". Обрабатывает действия пользователя и передаёт их в модель или представление.
Плюсы:
✅ Чёткое разделение обязанностей: Controller — менеджер, Model — кладовщик, View — продавец.
?Удобно тестировать логику и UI отдельно. Например, можно проверить, что Model правильно возвращает данные, даже если представление ещё не готово.
Минусы:
?Если Controller перехватывает слишком много работы, он превращается в "Божественный объект", который никто не хочет поддерживать.
Когда использовать?
Для веб-приложений средней сложности, где нужно чётко разделить логику, данные и интерфейс. И чтобы коллеги не говорили "весь код в одном файле".
5. Чистая архитектура (Clean Architecture) ?
Что это?
Чистая архитектура — это как шкаф с идеально разложенными вещами. Каждая полка — для своего типа одежды, и даже если вы купите новую футболку, вам не придётся переделывать весь шкаф. Всё чётко разделено по слоям, и каждый слой отвечает за свою задачу.
Слои:
Entities: Это как базовые правила в жизни — например, "всем участникам вечеринки можно выпить по одному коктейлю". Они не зависят от того, какой это бар или сколько человек в очереди.
Use Cases: Это "сценарии" — например, "заказать коктейль". Логика описывает шаги: сначала проверить возраст, потом взять деньги, а в конце выдать напиток.
Adapters: Это официанты, которые связывают бармена (сценарий) и клиента (интерфейс). Они переводят заказы в понятный для бара формат.
Frameworks: Это сам бар — оборудование, стулья, стойка. Оно не влияет на правила, но помогает всё организовать.
Плюсы:
?️ Легко тестировать: Хотите проверить, как работает "сценарий приготовления заказа"? Достаточно протестировать кухню без участия официантов и гостей.
? Независимость: Решили превратить кафе в фудтрак или заменить повара на автоматизированный конвейер? Логика готовки останется неизменной.
Минусы:
? Сложно вначале: "Почему для простого коктейля нужно 4 разных слоя?" — новички могут слегка запутаться.
? Долго настроить: На старте нужно время, чтобы правильно организовать шкаф, но потом это экономит силы.
Когда использовать?
Для больших долгоживущих проектов, где нужно часто что-то менять. Например, для корпоративных приложений, интернет-магазинов или систем бронирования. Особенно полезно, если вы хотите сделать код гибким и адаптируемым, как шкаф с полками, который можно перестраивать под новые вещи.
6. Event-Driven архитектура ?
Что это?
Event-Driven — это как чат в мессенджере: один участник что-то пишет (отправляет событие), остальные видят это и реагируют. Например: пользователь заходит на сайт → сервис авторизации отправляет событие "пользователь вошёл" → аналитика записывает данные, а сервис уведомлений шлёт приветственное сообщение. Всё это происходит асинхронно, никто никого не ждёт.
Плюсы:
⚡ Высокая производительность: Представьте, что официанты разносят заказы по сигналу с кухни, а не ждут, пока один из них вернётся. Сервисы работают параллельно, и все довольны.
? Гибкость: Нужно добавить нового участника? Например, сервис, который будет отправлять SMS ✉️ при входе пользователя. Просто подписываете его на нужное событие — и он включается в процесс.
Минусы:
?️ Отладка событий: Это как искать пропавшую посылку : все говорят, что её отправили, но никто не знает, где она застряла. Разобраться в цепочке событий может быть сложно.
Когда использовать?
Для систем, где нужно быстро реагировать на действия пользователя.
?️ В чатах : сообщение сразу появляется у всех участников.
? В играх : например, когда персонаж совершает действие, событие мгновенно обновляет данные у всех игроков.
?️ В IoT: умный дом получает сигнал от датчика и сразу включает свет.
Эта архитектура отлично подходит для систем реального времени, где важна скорость и гибкость. ?
7. Serverless-архитектура ☁️
Что это?
Serverless — это как автомагия: сервер где-то есть, но вы его не видите. Все функции живут в облаке и запускаются только тогда, когда это нужно. Например, пользователь загрузил картинку ?, и функция сразу начала её сжимать. Вы платите только за время работы этой функции.
Плюсы:
☁️ Не нужно администрировать серверы: Всё делает провайдер, например, AWS или Azure. Забудьте про настройку серверов, обновления или мониторинг.
? Автоматическое масштабирование: Если тысяча пользователей одновременно загружают картинки, облако само запускает больше функций. А когда нагрузка падает, мощности уменьшаются, и вы платите меньше.
Минусы:
⏱️ Время выполнения ограничено: Функции в облаке обычно ограничены по времени (например, 15 минут). Долгие задачи, вроде генерации отчёта за год, придётся разделять на части.
? Платишь за каждый вызов: Если вы вдруг стали популярны, и миллионы пользователей используют ваши функции, будьте готовы к внезапным счетам от провайдера.
Когда использовать?
Serverless идеально подходит для маленьких задач, которые запускаются по событию:
?️ Обработка изображений: Загрузили фото — функция сжала его и вернула результат.
? Уведомления: Пользователь сделал покупку, а функция отправила ему письмо с подтверждением.
? Аналитика: Функция обрабатывает данные раз в день или после какого-то события.
Serverless — это простой и удобный способ запускать небольшие функции, не тратя время на настройку серверов. Главное — следить за количеством вызовов, чтобы не "прилетел" огромный счёт. ?
Вывод ?
Каждая архитектура имеет свои плюсы и минусы, и выбор зависит от задач вашего проекта, команды и ресурсов.
Монолит — идеален для небольших проектов, стартапов или когда важна скорость разработки и запуска.
Микросервисы — подойдут для сложных, масштабируемых систем, где разные части приложения могут развиваться независимо.
Микрофронтенды — незаменимы для больших интерфейсов, особенно когда над ними работают распределённые команды.
MVC — хорош для проектов средней сложности, где важно чётко разделить бизнес-логику, интерфейс и контроллер.
Чистая архитектура — идеальный выбор для долгосрочных, масштабных проектов с высокими требованиями к поддерживаемости.
Event-Driven — подходит для систем с высокой нагрузкой и асинхронными процессами, например, чатов или IoT.
Serverless — отличный выбор для небольших, автономных задач, которые можно вынести в облако.
Архитектура — как рецепт: один и тот же пирог можно приготовить разными способами. Выбирайте подход, который подходит именно вашему проекту. Главное — чтобы всё работало, а не выглядело красиво только на бумаге. ?
Комментарии (18)
skovoroad
15.12.2024 12:11История видала подобные классификации
Животные делятся на:
принадлежащих Императору;
набальзамированных;
прирученных;
молочных поросят;
сирен;
сказочных;
бродячих собак;
включённых в эту классификацию;
бегающих как сумасшедшие;
бесчисленных;
нарисованных тончайшей кистью из верблюжьей шерсти;
прочих;
только что разбивших цветочную вазу;
похожих издали на мух.By_kosha Автор
15.12.2024 12:11Благодарю за такую интересную параллель! Может быть, моя статья действительно немного напоминает подобные классификации своим желанием упростить сложное. Но моя цель — не запутать, а наоборот, сделать архитектуры ПО понятными и даже немного увлекательными. Если получилось, то это уже успех! Я начинаю с самого начала, с того, с чего все мы когда-то начинали, чтобы помочь тем, кто только делает первые шаги в этой теме.
paw_junior
15.12.2024 12:11Это хорошее начинание.
Предыдущий комментатор справедливо обратил внимание, что статье не хватило четкого основания для классификации.
Я бы еще обратил внимание на "жизненные примеры". Где-то они есть, где-то их нет. Во всяком случае, лично я под жизненными примерами ожидаю, что будут бытовые вещи, как в случае с чистой архитектурой. Или где резюмируете, что архитектура - как рецепт. Это даже было бы идеально вынести в начало статьи.
Для монолита, микросервиса, микрофронтенда, MVC, EDA (допустим, мы принимаем данную классификацию) таких примеров не встретилось. Если вам удастся их подобрать - будет очень круто.
rukhi7
15.12.2024 12:11Знание модных названий - зачет.
А теперь попробуем перейти к практическим вопросам.
Вот вам репозиторий для примера:
https://github.com/LibreOffice/core
Что вы можете сказать об архитектуре этого проекта?
mrMazai
Интересно, легко, понятно. Хорошие сравнения. С дебютом!
By_kosha Автор
Спасибо за поддержку! Очень волнительно)