Сравнительная таблица архитектурных стилей
Сравнительная таблица архитектурных стилей

Введение

Это вторая часть цикла из 9-ти статей, посвящённых сравнительному анализу архитектурных стилей.
Данная статья посвящена архитектурному стилю «монолит».
1/9 базовая статья с подробным описанием таблицы.

⚠ Заметка

1. Рассматривая очередной архитектурный стиль, например монолитный, для краткости будет писаться «монолит», а не «монолит»-стиль и/или «монолит»-архитектура, и/или «монолит»-система, и/или «монолит»-компонента, подразумевая, что целевой постфикс будет определяться в зависимости от контекста.

2. Не смотря на то, что итоговые показатели в сравнительной таблице, есть результат относительного сравнения стилей относительно друг друга, при описании стиля «монолит» не будут упоминаться другие стили, т.к. автор проводил сравнительный анализ в историческом контексте (от верхних стилей к нижним).

Оглавление

  1. Общее описание

  2. Сравнительная классификация

    2.1. Ключевые сильные стороны

    2.2. Ключевые слабые стороны

  3. Рекомендации к использованию

Общее описание

✔ Определение

Архитектурный стиль «монолит» – стиль разработки ПО, ориентированный на решение ТЗ, калибром не более 2, обладающий следующими отличительными чертами: ► верхнеуровневая структура представлена в виде одного единственного компонента*; ► целевое ПО представлено в виде одного единственного артефакта**.

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

** как правило, артефактом является исполнительный файл, но «монолит» так же может быть, например, библиотекой или иным программным модулем более сложной системы.

⚠ Заметка

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

Сравнительная классификация

Ключевые сильные стороны

Const of Implementation (9/10)

«монолит» не подразумевает каких-либо специфических действий необходимых для обеспечения возможности реализации (нужен лишь компилятор и блокнот).

Const of ownershiping (9/10)

Стоимость владения «монолитом» либо бесплатна, либо ложится на плечи пользователя.

First/Next Deployability (9/10)

Первичная и последующие развёртывания системы на мощностях пользователя по факту являются лишь стандартной процедурой установки/переустановки целевого ПО.

Main-Structure (9/10)

Простейшая верхнеуровневая структура, является неоспоримым «преимуществом простоты» данного архитектурного стиля.

Infrastructure simplicity (9/10)

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

Web-communication tolerance (9/10)

ПО, созданное в монолитном стиле, запускается на единственной машине из-за чего, даже если у данной машины возникнут проблемы с сетевым сообщением, ПО не упадёт, но просто зависнет на время до возобновления связи с внешним миром*.

* стоит отметить, что если «монолит» имеет сетевой доступ, то, либо ПО написано на высокоуровневых языках (Python, Go), коммуникационное взаимодействие для которых поставляется из коробки, либо представляет некоторую web-библиотеку/модуль, предназначенный для использования в других система.

Performance (10/10)

Приложения, построенные в монолитном стиле, обладают высочайшей из доступных (потенциально доступных) производительностью.

Testability (9/10)

Тестирование монолитных приложений является наиболее простым с технической точки зрения (для этого достаточно отладчика и, желательно, IDE).

Ключевые слабые стороны

Agility (2/10)

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

* если же, какие-либо из требований меняются, то, как правило, это повод задуматься о создании нового ПО в замен текущему.

Abstraction Level (2/10)

«монолит» не имеет какого-либо уровня абстракции в виду того, что на логическом уровне совокупная система не декомпозируется по компонентам*.

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

Configurability (2/10)

«монолит» не подразумевает гибкость рода смены конфигурации* под запросы пользователя**.

* если вы начали мысли в эту сторону, то, вероятно, нуждаетесь в перепроектировании целевого ПО.

** исключением, однако, могут быть ситуации, когда монолитное приложение изначально создано как некоторый конструктор компонентов и/или инструмент конструирования, когда бы целевые задачи решались только в случае специфической настройки базисной модели (но по средствам конфигурационных файлов, без вмешательства в исходный код).

Domain portioning (1/10)

«монолит» – это один компонент и одна роль*!

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

Component-Structure Simplicity (2-9/10)

«монолит», будучи состоящим из одного единственного компонента*, образующего всю систему целиком, может дожить до ситуации, когда сложность такового компонента будет исключительно большой**.

* ситуация единственности компонента является не только отличительной чертой «монолита», но и его главным преимуществом, т.к. для того, что начать создавать ПО в этом стилей, нужно просто взять и начать программировать.

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

Hardware fault tolerance (2/10)

«монолит», будучи лишь процессом в ОС, просто не может выполнять своих функций в случае отказа среды исполнения.

System component fault tolerance (2/10)

Поскольку «монолит», состоит из одного единственного компонента, то его отказ равносилен отказу всего ПО.

Technical Decomposition (2/10)

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

* отдельные простые классы и/или функции, но не целые блоки кода, имеющие специфическую внутреннею логику и скрывающие детали своей реализации.

** если вы начали думать а целевом ПО так, что отделяете на логическом уровне различные части его функционала, то, это причина задуматься о смене архитектурного стиля.

Technical Evolvability (2/10)

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

Elasticity (2/10)

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

Рекомендации к использованию

Односложные, однопоточные, простые программы, изолированные по данным и процессам их обработки, как правило не требующие сетевого взаимодействия* и предназначенные для решения одной ТЗ:

  • скрипты настройки окружения;

  • утилиты/демоны ОС;

  • вспомогательные/служебные программы/библиотеки;

  • отдельные модули/компоненты более сложных систем;

  • драйверы.

* либо изначально представляющие односложный компонент, предназначенные для обеспечения сетевого взаимодействия (таковыми являются различные коммуникационные библиотеки вплоть до транспортного уровня семиуровневой модели OSI).

Заключение

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


Следующая статья (3/9) будет посвящена детальному описанию архитектурного стиля Modular Monolithic.

Заметки:

Статьи будут выходить примерно раз неделю.
Подписывайтесь на мой ТГ канал - t.me/TopITBlog - посвященный архитектуре ПО:

  • там даны ссылки на источники и на документ с уже готовым материалом;

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

Комментарии (11)


  1. SpiderEkb
    12.11.2023 08:10
    +1

    А как характеризовать архитектуру, которая формально не является микросервисной, но и не подходит под определение монолита, поскольку является набором отдельных модулей, каждый из которых разрабатывается, тестируется и внедряется отдельно и может быть при необходимости модифицирован или даже заменен с сохранением контракта? Модули хоть и работают на одном сервере, но при этом в изолированных друг от друга заданиях (job) и связаны между собой через ABI.


    1. AlexeyPerestoronin Автор
      12.11.2023 08:10
      -1

      Из того, что вы написали, стиль microkernel подходит больше всего.


      1. SpiderEkb
        12.11.2023 08:10

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

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

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

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

        Нужно ввести в систему новый тип сообщения? Пишем модуль-обработчик и добавляем его в настроечные таблицы движка. Нужно поменять логику обработки? Модифицируем соответствующий обработчик (не трогая всего остального).

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

        Ну и так далее и тому подобное.


        1. AlexeyPerestoronin Автор
          12.11.2023 08:10

          Не уверен, что правильно понял вас в совокупном контексте, но, если правильно, то кажется архитектурные стили нужно понимать более общё, как некую концепцию, а не свод формальных
          правил.
          Я бы употребил такую метафору:

          • пусть архитектура создания ПО - это некоторый язык общения, формализующий общие правила построения предложений;

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

          • а вот конкретное ПО - это, например, рассказ "Шинель" М.В. Гоголя.

          Т.е. я по прежнему считаю, что ответ на ваш первый вопрос - mikrokernel
          Если же учесть дополнительную информацию, полученную во втором ответе - mikrokernel + event driven.


  1. panzerfaust
    12.11.2023 08:10
    +3

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

    А вы не путаете подход "монолит" и методологию "водопад"?

    • скрипты настройки окружения;

    • утилиты/демоны ОС;

    • вспомогательные/служебные программы/библиотеки;

    • отдельные модули/компоненты более сложных систем;

    • драйверы.

    По вашему эти продукты "не меняются на протяжении всего жизненного цикла"?


    1. AlexeyPerestoronin Автор
      12.11.2023 08:10
      -2

      А вы не путаете подход "монолит" и методологию "водопад"?

      Согласен с вами, очень похоже на то как формулируются концепция водопадной работки, но, тем не менее, это не есть ошибка с моей стороны: своим предложением я хотел сказать ровно то, что написано, но, возможно, менее путано прозвучало бы так «монолит» подразумевает разработку приложений столь простых, что каждая новая итерация разработки может быть начата с выработки новых требований и полной переделки проекта
      (я вообще, я подумаю в следующих статьях, как избегать такой двусмысленности; спасибо :smile:)

      По вашему эти продукты "не меняются на протяжении всего жизненного цикла"?

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


  1. flancer
    12.11.2023 08:10
    +2

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

    Что-то какой-то сферический конь в вакууме получился. Боюсь, что к применению "монолита" на практике этот пост имеет такое себе отношение.


    1. AlexeyPerestoronin Автор
      12.11.2023 08:10

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


      1. nin-jin
        12.11.2023 08:10
        +2

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

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

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


        1. AlexeyPerestoronin Автор
          12.11.2023 08:10
          -2

          Вы, похоже, под "монолитом" понимаете нечто отличное, от того ...

          В будущих статьях я обещаю учесть текущие замечания и избавиться от двусмысленности.

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

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

          Вот смотрю я вашу табличку и не вижу там ни реплицированного монолита...

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

          Большое спасибо за ценные замечания))


          1. nin-jin
            12.11.2023 08:10

            Реплицированный монолит, например, не боится выхода из строя одного сервера, так как его функции берут на себя остальные инстансы. Соответственно и масштабируется он горизонтально относительно просто. Характерный пример - мультимастер субд.