Я недавно решила углубленно разобраться, какие архитектуры бывают в разработке ПО, и написать об этом простую статью. Это моя первая попытка поделиться своими мыслями и объяснить сложные вещи на понятном языке, поэтому буду рада вашей обратной связи!

Здесь я постаралась рассказать про монолиты, микросервисы и микрофронтенды без сложных терминов и технических деталей, чтобы те, кто только начинает разбираться в теме, могли понять, что к чему. Надеюсь, вам будет полезно и интересно. Поехали! ?

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)


  1. mrMazai
    15.12.2024 12:11

    Интересно, легко, понятно. Хорошие сравнения. С дебютом!


    1. By_kosha Автор
      15.12.2024 12:11

      Спасибо за поддержку! Очень волнительно)


  1. skovoroad
    15.12.2024 12:11

    История видала подобные классификации

    Животные делятся на:

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


    1. By_kosha Автор
      15.12.2024 12:11

      Благодарю за такую интересную параллель! Может быть, моя статья действительно немного напоминает подобные классификации своим желанием упростить сложное. Но моя цель — не запутать, а наоборот, сделать архитектуры ПО понятными и даже немного увлекательными. Если получилось, то это уже успех! Я начинаю с самого начала, с того, с чего все мы когда-то начинали, чтобы помочь тем, кто только делает первые шаги в этой теме.


      1. paw_junior
        15.12.2024 12:11

        Это хорошее начинание.

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

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

        Для монолита, микросервиса, микрофронтенда, MVC, EDA (допустим, мы принимаем данную классификацию) таких примеров не встретилось. Если вам удастся их подобрать - будет очень круто.


  1. rukhi7
    15.12.2024 12:11

    Знание модных названий - зачет.

    А теперь попробуем перейти к практическим вопросам.

    Вот вам репозиторий для примера:

    https://github.com/LibreOffice/core

    Что вы можете сказать об архитектуре этого проекта?