Монолит как правильно делать: Как залить плиту перекрытия правильно: поэтапное описание технологии

Содержание

Строим правильный монолит / Хабр


Монолиты слишком раскритикованы

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


Если вы новичок в бекенд-разработке, напомню: монолит – это серверная система, работающая как одно целое. То есть, это одна-единственная программа, которая запускается, обслуживает некоторое количество сетевых запросов и после этого завершается. Альтернативы монолиту – это, в частности, сервис-ориентированные архитектуры (SOA), микросервисы, бессерверные функции – пожалуй, этим список не исчерпывается. Каждому из этих подходов есть свое время и место, поэтому можно только приветствовать любые обоснованные решения, при которых новая система создается в соответствии с одним или другим из этих паттернов. Я считаю, что значительное количество веб-приложений и сервисов вполне можно обслужить при помощи монолита… немного его усовершенствовав.


Понадобятся сервисы, помогающие разгрузить монолит

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


Находим компромиссный вариант

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


Знакомьтесь: паттерн проектирования SUFA

Прежде, чем объяснить по существу, что же такое SUFA, упомяну, что это не абсолютно новая концепция. Уже давно существуют такие вещи как паттерн «актор», парадигма «неомонолит» и другие, в рамках которых были постулированы схожие идеи, а SUFA – это просто одна из возможностей, позволяющих скомбинировать несколько концепций в простой и понятный паттерн проектирования. Итак, что же это?
S(Простые), U(Унифицированные), F(функциональные) A(Приложения).
Разберем каждый компонент:


Простые (Simple)

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


Унифицированные (Unified)

Система SUFA использует не множественные сервисы, каждый из которых существует как самостоятельная развертываемая единица, а представляет собой единый развертываемый файл. Это может быть образ Docker, или AMI, или какой-нибудь другой артефакт, но, в любом случае, нам требуется построить всего одну штуку. Строить ее нужно методом непрерывной интеграции и доставки (CI/CD) в рамках непрерывной или размеченной каденции релизов, а предоставлять через реестр артефактов – например, реестр Docker или корзину S3.


На основе функций (Function-based)

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


Приложения (Applications)

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

Вы уже замечаете, что такой подход совершенно не зависит ни от технологий, ни от вендоров. SUFA по определению межъязыковые, рассчитаны на работу в разных облаках и средах развертывания. SUFA – это способ спроектировать серверную систему так, чтобы способствовать ее тестируемости, масштабируемости и безопасности. Кстати, я еще не касался масштабирования, так что давайте о нем поговорим.


SUFA в большом масштабе

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

Дополнительная масштабируемость обеспечивается при помощи групп возможностей и создания сетей данных (meshing).


Suborbital Atmo

Паттерн SUFA был спроектирован в расчете на работу с Atmo – это универсальный фреймворк, на основе которого особенно удобно строить SUFA-системы. Atmo использует файл под названием «Directive», в котором описываются все аспекты вашего приложения, в том числе, как сцеплять функции для обработки запросов. Функции, которые смогут работать поверх Atmo, могут быть написаны на разных языках. Фреймворк использует модули WebAssembly как вычислительные единицы. Atmo автоматически масштабируется горизонтально, чтобы обрабатывать нагрузку, поступающую в ваше приложение, содержит всевозможные инструменты и реализует наилучшие практики, обеспечивая высокий уровень производительности и безопасности и не требуя от вас писать ни строчки шаблонного кода.

Потрясающие возможности WebAssembly и продуманный дизайн SUFA можно попробовать на свободной платформе Suborbital Development Platform, чтобы по-новому подойти к созданию веб-приложений. На волне новых технологий и практик, таких, как JAMStack и пограничные вычисления, мы можем взять лучшее от новых и старых парадигм, чтобы делать невероятные вещи.

Подушка под монолитную плиту фундамента: технология устройства

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

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

Под фундаментную плиту устраивают подушку, она уменьшит нагрузки и обеспечит долговечность каркаса строения.

Содержание

  1. Зачем фундаменту нужна подушка
  2. Подготовка участка
  3. Песчаная подушка
  4. Какой нужен песок
  5. Толщина подушки
  6. Засыпка щебня
  7. Вывод

Зачем фундаменту нужна подушка

Здание прослужит максимально долго, если его подземная часть выполнена правильно. Подушка позволяет:

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

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

  • Глубину, на которую промерзает грунт;
  • Высоту подъема грунтовых вод в месте постройки;
  • Примерную величину нагрузок на будущий фундамент;
  • Геологические и сейсмические данные местности.

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

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

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

Подготовка участка

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

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

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

Песчаная подушка

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

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

Засыпка осуществляется в следующем порядке:

  • Дно котлована выстилают изолирующим материалом (хорошо зарекомендовал себя геотекстиль), оставляя со всех сторон части, достаточные, чтобы потом накрыть верх и бока подушки. Так предотвращают возможное заиливание песка подземными водами в будущем.
  • Засыпают песок, который вычисляют, умножая длину подушки на ее высоту и ширину. Учитывая уплотнение песка при трамбовании, полученный при расчетах объем лучше взять с запасом примерно 10-15%.
  • Производят утрамбовывание песка до предельно возможной плотности, сохраняя запланированную толщину слоя. На качественно утрамбованной поверхности не должны оставаться следы, если по ней пройдет человек. Лучший результат приносит использование виброплиты, ручной трамбовкой сложно обеспечить необходимое качество работ. Для увеличения плотности песка, площадку время от времени проливают водой. Поверхность должна быть без углублений; ее выравнивают по горизонтали, используя уровень.
  • Накрывают готовую подушку изолирующим материалом. Если запланирована дальнейшая засыпка щебнем, поверх изоляции во избежание его повреждений засыпают слой песка толщиной около 5 см.

Какой нужен песок

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

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

Наиболее подходящими являются:

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

Толщина подушки

Расчеты подушки проводят, опираясь на следующие данные:

  • Вид и свойства грунта, на котором проводится строительство.
  • Информация о грунтовых водах – наличие или отсутствие, глубина их залегания.
  • На какую глубину зимой промерзает грунт.
  • Тип фундамента, запланированный в проекте.
  • Размеры и вес возводимого здания.

Нормальные геологические условия допускают устройство песчаной подушки толщиной от 10 до 25 см.

Засыпка щебня

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

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

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

Вывод

В современном строительстве под монолитный фундамент часто делают подушку из слоев песка и щебня.

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

12 способов подготовить свой монолит перед переходом на микросервисы

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

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

#1 Убедитесь, что вы знаете, что вы получаете

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

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

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

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

  • Создание микросервиса Go с помощью Gin и CI/CD
  • CI/CD для микросервисов в DigitalOcean Kubernetes
  • CI/CD для загрузки Microservice Spring

#2 Составьте план

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

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

При планировании необходимо:

  • Распутать зависимости внутри монолита.
  • Определите необходимые микросервисы.
  • Дизайн моделей данных для микросервисов.
  • Разработайте метод переноса и синхронизации данных между монолитными базами данных и базами данных микросервисов.
  • Разработка API и планирование обратной совместимости.
  • Зафиксируйте базовую производительность монолита.
  • Установите цели доступности и производительности новой системы.

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

#3 Поместите все в монорепозиторий

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

Скорее всего, ваш монолит уже содержится в одном репозитории. Итак, это просто вопрос создания новых папок для микросервисов.

Монорепозиторий — это общий репозиторий, содержащий монолит и новые микросервисы.

#4 Используйте общий конвейер CI

Во время разработки вы будете не только постоянно выпускать новые микросервисы, но и повторно развертывать монолит. Чем быстрее и безболезненнее будет этот процесс, тем быстрее вы сможете прогрессировать. Настройте непрерывную интеграцию и доставку (CI/CD) для автоматического тестирования и развертывания кода.

Если вы используете монорепозиторий для разработки, вам нужно помнить о нескольких вещах:

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

Настройте отчеты о тестировании для быстрого обнаружения и устранения сбоев.

#5 Убедитесь, что у вас достаточно тестов

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

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

Пирамида тестирования

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

#6 Установка шлюза API или обратного прокси-сервера HTTP

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

Существует несколько способов маршрутизации запросов в зависимости от их характера:

  • Шлюз API позволяет перенаправлять вызовы API на основе таких условий, как прошедшие проверку пользователи, файлы cookie, флаги функций или шаблоны URI.
  • Обратный прокси-сервер HTTP делает то же самое, но для HTTP-запросов. В большинстве случаев монолит реализует пользовательский интерфейс, поэтому большая часть трафика будет идти туда, по крайней мере, поначалу.
Используйте шлюзы API и обратные прокси-серверы HTTP для маршрутизации запросов к соответствующей конечной точке. Вы можете переключаться между монолитом и микросервисами на очень мелком уровне.

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

#7 Рассмотрим шаблон «монолит в коробке»

Хорошо, этот вариант применим только в том случае, если вы планируете использовать контейнеры или Kubernetes для микросервисов. В этом случае контейнеризация может помочь вам гомогенизировать вашу инфраструктуру. Шаблон монолита в коробке состоит из запуска монолита внутри контейнера, такого как Docker.

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

  1. Узнайте о Docker и контейнерах.
  2. Запустите свой монолит в контейнере.
  3. Разрабатывайте и запускайте микросервисы в контейнере.
  4. После завершения миграции и освоения контейнеров узнайте о Kubernetes.
  5. По ходу работы можно масштабировать микросервисы и постепенно переводить на них трафик.
Контейнеризация вашего монолита — это способ стандартизации развертывания и отличный первый шаг в изучении Kubernetes.

#8 Подготовка к изменениям

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

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

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

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

#9 Использование флагов функций

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

Типичный рабочий процесс для миграции с включенным флагом функции:

  1. Определите часть функциональности монолита для миграции в микрослужбу.
  2. Оберните функциональность флагом функции. Повторно разверните монолит.
  3. Создайте и разверните микрослужбу.
  4. Протестируйте микрослужбу.
  5. Когда все будет удовлетворено, отключите эту функцию на монолите, выключив ее.
  6. Повторяйте, пока миграция не будет завершена.

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

#10 Модульность монолита

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

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

Многоуровневые и модульные монолитные архитектуры.

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

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

Этот монолит Java был разделен на независимые модули.

Два шаблона могут помочь вам реорганизовать монолит: фиговый душитель и уровень защиты от коррупции.

Паттерн инжира-душителя

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

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

Монолит состоит из модулей по частям. В конце концов, старый монолит исчезает и заменяется новым.

Шаблон уровня защиты от коррупции

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

Уровень защиты от повреждения предотвращает распространение изменений путем перевода вызовов между модулями и монолитом.

#11 Разделение данных

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

Вас может шокировать осознание необходимости денормализации общей базы данных монолита в (часто избыточные) меньшие базы данных. Но локальность данных — это то, что в конечном итоге позволит микросервисам работать автономно.

Разделение данных на отдельные и независимые базы данных.

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

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

#12 Добавление наблюдаемости

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

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

Метрики используются для сравнения производительности

Заключение

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

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

Приятного программирования и спасибо за чтение!

Как разбить монолит на микросервисы

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

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

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

Назначение экосистемы микросервисов

Прежде чем приступить к работе, важно, чтобы у всех было общее понимание экосистема микросервисов. Экосистема микросервисов — это платформа сервисов, каждый из которых инкапсулирует деловые возможности. Бизнес-возможности представляют то, что бизнес делает в конкретной области для выполнения своих целей и обязанностей. Каждая микрослужба предоставляет API, который разработчики могут обнаружить и использовать в манера самообслуживания. Микросервисы имеют независимый жизненный цикл. Разработчики может создавать, тестировать и выпускать каждый микросервис независимо. Экосистема микросервисов обеспечивает организационную структуру автономных давние команды, каждая из которых отвечает за одну или несколько служб. Вопреки общему мнению и «микро» в микросервисах, размер каждая услуга имеет наименьшее значение и может варьироваться в зависимости от операционной Зрелость организации. Как говорит Мартин Фаулер, «микросервисы — это ярлык, а не описание».

Рисунок 1. Службы инкапсулируют бизнес возможности, предоставлять данные и функциональные возможности через самообслуживание API

Путеводитель

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

Разминка с помощью простой и достаточно независимой функции

Для запуска пути микросервисов требуется минимальный уровень оперативная готовность. Требуется доступ по запросу к развертыванию окружающую среду, строя новые виды конвейеров непрерывной доставки для самостоятельно создавать, тестировать и развертывать исполняемые сервисы, а способность защищать, отлаживать и контролировать распределенную архитектуру. Зрелость оперативной готовности требуется независимо от того, строим ли мы новые услуги или декомпозицию существующей системы. Для получения дополнительной информации об этой оперативной готовности см. статью Мартина Фаулера о Требования к микросервисам. Хорошая новость заключается в том, что после статьи Мартина технология работы архитектура микросервисов быстро развивалась. Это включает в себя создание Service Mesh, специализированной уровень инфраструктуры для запуска быстрой, надежной и безопасной сети микросервисов, системы оркестрации контейнеров для обеспечить более высокий уровень абстракции инфраструктуры развертывания и эволюция систем непрерывной доставки, таких как GoCD для создания, тестирования и развертывания микросервисов в виде контейнеров.

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

Сначала я рекомендовал отделить простые пограничные службы. Далее мы используем другой подход, разделяющий возможности, глубоко встроенные в монолитная система. Я советую сначала использовать пограничные службы, потому что в В начале пути самый большой риск для бригад доставки — это неспособность управлять микросервисы должным образом. Так что хорошо использовать пограничные сервисы для практиковать эксплуатационные предпосылки им нужно. После того, как они решили это, они могут обратиться к Ключевая проблема расщепления монолита.

Рисунок 2: Прогрев с помощью простой возможности, которая имеет малый радиус изменения для создания нашей оперативной готовности

Сведение к минимуму зависимости обратно к монолиту

В качестве основополагающего принципа группы доставки должны свести к минимуму зависимости новообразованных микросервисов в монолит. Основное преимущество микросервисы должны иметь быстрый и независимый цикл выпуска. Имея зависимости от монолита — данные, логика, API — связывает сервис к циклу выпуска монолита, запрещая это преимущество. Часто основная мотивация ухода от монолит – это высокая стоимость и медленный темп изменения заблокированных возможностей в нем, поэтому мы хотим постепенно двигаться в направлении, которое отделяет эти основные возможности путем удаления зависимостей от монолита. Если команды следуют этому правилу, встраивая возможности в свои собственные услуги, вместо этого они находят зависимости в обратном направлении, от монолита до сервисов. Это желаемое направление зависимости, поскольку оно не замедляет снизить темпы изменений для новых услуг.

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

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

Рисунок 3. Отделите службу, которая не требует сначала зависимости от монолита и минимизирует изменения на монолит

Разделить липкие возможности в начале

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

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

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

Рис. 4. Определите наиболее связанную концепцию и разъединять, деконструировать и воплощать в конкретные доменные службы

Используйте инструменты анализа зависимостей и структурного кода, такие как Структура101 для выявления наиболее возможности связывания и сдерживающего фактора в монолите.

Разделение по вертикали и ранний выпуск данных

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

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

Стратегия состоит в том, чтобы перемещать возможности по вертикали, отделять основные возможности с его данными и перенаправить все интерфейсные приложений к новым API.

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

Рисунок 5: Возможность развязки с ее данными к микросервису, открывающему новый интерфейс, изменять и перенаправлять потребителей к новому API

Избегайте антипаттерна только разъединения фасадов, только разъединения серверную службу и никогда не разделять данные.

Разделите то, что важно для бизнеса, и то, что часто меняется

Сложно отделить возможности от монолита. Я слышал Нил Форд использует аналогию с бережная хирургия органов. В приложении интернет-магазина извлечение возможность включает в себя тщательное извлечение данных возможности, логики, компоненты, с которыми сталкиваются пользователи, и перенаправление их на новый сервис. Поскольку это нетривиальный объем работы, разработчикам необходимо постоянно оценивать стоимость развязки по сравнению с выгодами что они получают, например. идет быстрее или растет в масштабе. Например, если цель групп доставки — ускорить модификацию существующих возможностей заблокированы в монолите, то они должны идентифицировать возможность, которая модифицируется самому вывезти. Разделяйте части кода, которые постоянно измениться и получить много любви от разработчиков и ограничивая их больше всего, чтобы доставить ценность быстро. Команды доставки могут анализировать код зафиксировать шаблоны, чтобы узнать, что исторически изменилось больше всего, и наложите это на дорожную карту продукта и портфолио, чтобы понять наиболее желаемые возможности, которые будут привлекать внимание в ближайшем будущем. Им нужно поговорить с бизнес-менеджерами и менеджерами по продуктам, чтобы понять отличительные способности, которые действительно важны для них.

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

Рисунок 6. Определите и отделите возможность, которая важнее всего: создает наибольшую ценность для бизнеса и клиентов, в то время как регулярно меняется.

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

Возможность развязки, а не код

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

Часто по умолчанию извлечение службы или декомпозиция монолита представить как случай повторного использования существующей реализации как есть и выделение его в отдельный сервис. Отчасти потому, что у нас есть когнитивное искажение кода, который мы разрабатываем и пишем. Труд построения, каким бы болезненным ни был процесс или несовершенным результат, заставить нас расти любовь к нему. Это на самом деле известно как Эффект ИКЕА. К сожалению, это предубеждение будет сдерживать усилия по разложению монолита. Это заставляет разработчиков и, что более важно, технических менеджеров не обращайте внимания на высокую стоимость и низкую ценность извлечения и повторного использования кода.

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

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

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

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

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

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

Рис. 7. Повторное использование и извлечение важного кода с помощью низкая токсичность, переписать и удалить код с низким значением с высоким токсичность

Используйте инструменты анализа токсичности кода, такие как CheckStyle для принятия решений переписать против повторного использования.

Сначала макрос, затем микро

Поиск границ домена в устаревшем монолите искусство и наука. Как правило, применение доменно-ориентированного дизайна методы поиска ограниченных контекстов Определение границ микросервисов — хорошее место для начала. Признаюсь, слишком часто я вижу гиперкоррекцию от большого монолита к действительно маленькие услуги, действительно маленькие услуги, дизайн которых вдохновлен и движим существующим нормализованным представлением данных. Такой подход к определению границ услуг почти всегда приводит к кембрийский взрыв большого числа анемичных сервисов для ресурсов CRUD. Для многих новичков в микросервисах архитектуре, это создает среду с высоким трением, которая в конечном итоге не проходит тест на независимый выпуск и выполнение сервисов. Это создает распределенную систему, которую трудно отладить, распределенную систему который выходит за рамки транзакций и, следовательно, его трудно поддерживать последовательность, система, которая слишком сложна для оперативного Зрелость организации. Хотя есть некоторые эвристики о том, как «микро» должен быть микросервисом: размер команды, время на перепишите службу, сколько поведения она должна инкапсулировать и т. д. Мой совет: что размер зависит от того, сколько обслуживает бригады доставки и эксплуатации может самостоятельно выпускать, следить и работать. Начните с более крупных сервисов вокруг логического домена концепцию и разбить сервис на несколько сервисов, когда команды оперативно готов.

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

Рис. 8. Отделение макросервисов от богатого домена концепции и, когда они будут готовы, услуги разбивки на меньший домен концепции

Используйте модель зрелости Richardson L3 и гиперссылки, позволяющие в будущем отделить услуги, не влияя на вызывающих абонентов, то есть вызывающий абонент узнает, как оформить заказ, и не знает заранее.

Переход на этапы атомной эволюции

Идея растворить устаревший монолит в воздухе путем разъединения превратить его в красиво оформленные микросервисы — своего рода миф и возможно нежелательно. Любой опытный инженер может поделиться историями о наследии попытки миграции и модернизации, которые были спланированы и инициированы из-за оптимизма полного завершения, и в лучшем случае достаточный момент времени. Долгосрочные планы таких начинаний отбрасываются потому что макроусловия меняются: у программы заканчиваются деньги, организация переключает свое внимание на что-то другое или на лидерство в поддержку из него уходит. Таким образом, эта реальность должна быть разработана в том, как команды подходят к переход от монолита к микросервисам. Я называю этот подход «миграцией в атомарные шаги эволюции архитектуры», где каждый шаг миграция должна приблизить архитектуру к ее целевому состоянию. Каждый единицей эволюции может быть маленький шаг или большой скачок, но она атомарна, либо завершается, либо возвращается. Это особенно важно, поскольку мы применяя итеративный и поэтапный подход к улучшению общего услуги по архитектуре и развязке. Каждое приращение должно оставить нас в лучшее место с точки зрения архитектурной цели. Используя эволюционная архитектура метафора фитнес-функции, архитектурная фитнес-функция после каждого атомарный шаг миграции должен генерировать более близкое значение к цель архитектуры.

Позвольте мне проиллюстрировать это на примере. Представьте себе цель микросервисной архитектуры — увеличить скорость разработчиков изменение всей системы для обеспечения ценности. Команда решает отделить аутентификацию конечного пользователя в отдельную службу на основе Протокол OAuth 2.0. Эта услуга предназначена как для замены существующее клиентское приложение (старой архитектуры) аутентифицирует конец пользователя, а также микросервисы новой архитектуры проверяют конечного пользователя. Назовем этот шаг в эволюции «внедрением службы аутентификации». Один из способов представить новую услугу — выполнить следующие шаги. первый:

(1) Создайте службу проверки подлинности, реализующую протокол OAuth 2.0.

(2) Добавьте новый путь аутентификации в серверной части монолита для вызова Сервис аутентификации для аутентификации конечного пользователя, от имени которого он обработка запроса.

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

Вместо этого команда может включить следующие шаги в нашу атомарную единицу эволюция:

(3) Замените старый клиентский пароль/аутентификацию на основе сеанса на Путь OAuth 2.0

(4) Удаление старого пути кода аутентификации из монолита

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

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

Атомный блок разложения монолита включает в себя:

  • декап новый сервис
  • Перенаправить всех потребителей на новую службу
  • Убрать старый путь кода в монолите.

Антишаблон: отделить новую услугу, использовать для новых потребителей и никогда не увольнять старое.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *