Просто о сложном – архитектура приложения простыми словами.

Просто о сложном – архитектура приложения простыми словами.

Цифровая революция бушует вокруг нас, и даже если вы не человек из IT-сферы, многие понятия так или иначе докатываются и до вас: блокчейн, контейнеры, ИИ, микросервисная архитектура.
Эти слова как «базворды» жужжат на каждом шагу, и сегодня я хочу рассказать об одном из них – что такое микросервисная архитектура на простом примере.

Слово микросервисная уже наталкивает на некую измельчённость и атомарность. И, наверное, кто-то уже задавался вопросом: раз есть микросервисная архитектура, а какая ещё бывает? Наносервисная? Макросервисная? Просто сервисная?
Начнём с того, что IT — это инженерная наука, а инженеры всегда направлены на создание конкретных изобретений, и чем серьёзнее изобретения, тем более сложными они становятся и в конечном итоге превращаются в систему.

Книга Генриха Альтшулера
Книга Генриха Альтшулера

Ещё в 60-х годах появилась теория решения изобретательских задач (ТРИЗ). Примечательным фактом является то, что теория эта родилась в СССР, что я лично считаю предметом для гордости. А всем инженерам (в том числе IT-специалистам) рекомендую с ней ознакомиться.

Так вот, согласно ТРИЗ, система может развиваться в 3-х направлениях:1. Линейно улучшаться и развиваться «вправо» — превращаясь в мощный монолит;2. Переходить в надсистему — становиться сервисом большой системы;3. Измельчаться — переходить на микроуровень.

Развитие системы с точки зрения ТРИЗ
Развитие системы с точки зрения ТРИЗ

ИТ-системы – такие же инженерные системы как системы водоснабжения, энергоснабжения, двигатель внутреннего сгорания и так далее.
А потому к ним применимы все те же законы и правила, описанные в ТРИЗ.

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

1. Линейное развитие и совершенствование

Линейное развитие системы
Линейное развитие системы

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

А функция бензобака просто переносится в батарею.

2. Переход в надсистему

MacBook как пример надсистемы
MacBook как пример надсистемы

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

Яркий пример — MacBook. Так выглядит его «подкапотка»:

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

3. Измельчение системы

Просто о сложном – архитектура приложения простыми словами.

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

Каждая деталь лука представляет собой самостоятельный, отделяемый компонент и выполняет конкретную функцию.

Справа можно наблюдать реализацию той же функции — метание стрел — реализованную в монолитной системе.

Другим примером может служить человеческое общество. В древности для выживания нам требовалось знать очень много вещей об окружающем мире: что можно есть, а что нет; как лечить раны; как шить одежду; как строить дом и так далее.

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

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

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

Ремонт - the begining
Ремонт - the begining

Итак, представим ситуацию: нам нужно сделать ремонт в квартире, и мы выбираем подходящего исполнителя.

Лучшие исполнители
Лучшие исполнители

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

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

Монолитная система

Александровская колонна монолитна по структуре
Александровская колонна монолитна по структуре

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

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

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

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

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

Плюсы:

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

Минусы:

• Высокая зависимость бизнеса от конкретного ИТ-актива;
• Низкая скорость развития и сложности тестирования;
• Сложность замены отдельных элементов системы;
• Сложность масштабирования.

Сервисная архитектура

Пирамиды состоят и крупных блоков
Пирамиды состоят и крупных блоков

Ситуация становится более сложной, когда вам говорят: «У нас нет нормального электрика, сантехника и т. д., мы можем сделать только часть работ, а вот на остальные вам нужно искать кого-то ещё». Это может произойти, если вы решите снизить зависимость от одного исполнителя и нанимаете несколько команд. Например, в силу того, что я писал выше - чем универсальнее работник, тем хуже его навыки в какой-то определённой области.

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

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

Функция оркестрации присутствует и в монолите, но за счёт его многофункциональности, сосредоточенной в одном месте, она не так явно бросается в глаза. Монолит не скажет вам: «Я только плитку кладу, а вот кто и когда будет клеить обои, я не знаю».

А вот при работе с разными сервисами так не получится. Скорее всего, вы услышите: «Когда закончите черновые работы — позвоните, если будем свободны, обои поклеим». Бригада, которая фокусируется на небольшой области деятельности, тоже выигрывает, так как может сосредоточиться на конкретных навыках, довести их до совершенства. Если все плюс-минус умеют одно и то же, то потеря члена команды не будет фатальной, хотя порой и придётся отказывать клиентам в выполнении заказа. Или можно попробовать найти доверенных партнёров на профильную деятельность.

Плюсы:

• Повышение уровня независимости элементов системы друг от друга, снижение сложности замены элементов;
• Повышение отказоустойчивости системы в целом;
• Возможность предъявлять разные требования к элементам системы;
• Повышение гибкости развития системы;
• Повышение прозрачности бизнес-процессов.

Минусы:

• Усложнение проектирования архитектуры системы;
• Рост требований по производительности к сетевой инфраструктуре;
• Повышение уровня угроз по информационной безопасности.

Микросервиса архитектура

Кремлёвская стена состоит из небольших блоков - кирпичей
Кремлёвская стена состоит из небольших блоков - кирпичей

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

В таком случае сервис «установка сантехники» начинает дробиться на более мелкие работы:

• установить смеситель;
• установить душевую кабину;
• установить систему контроля протечек;
• и так далее.

Вот вы и перешли от уровня сервисной (крупноблочной архитектуры) к микросервисной.

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

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

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

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

А вот если вы сначала установите раковину, а потом решите подвести к ней воду — вас ждёт крайне неприятный сюрприз с цепочкой откатов операций, повторным выполнением и потраченными зря ресурсами.

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

Плюсы:

• Высокий уровень атомарности элементов архитектуры;
• Простота масштабирования;
• Малое влияние каждого элемента на систему;
• Лёгкость замены каждого элемента.

Минусы:

• Дорогостоящая система оркестрации верхнего уровня;
• Сложно отслеживать сквозной процесс;
• Сложность проектирования архитектуры.

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

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

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

44
Начать дискуссию