И вот настал тот день, когда я наконец соизволил встать с дивана и дописать следующую статью о микросервисах. Кто не в теме - в прошлой части мы выяснили, как сильно неправильная пунктуация и тупые приколы могут раздражать. Ну и немного обсудили, что такое микросервисы и зачем они вообще нужны. Не будем отходить от трендов и в этой части, продолжим погружаться в этот дивный мир машинного перевода, шуточек за 300 и микросервисов.
Глобально существует два способа перехода на новую архитектуру: либо мы делаем все за раз, либо по частям. Первый способ выглядит очень неплохо на бумаге: составляем структуру будущей микросервисной архитектуры, делимся на команды, закрываем разработку новых фич и полностью переключаемся на миграцию. Получается очень круто, модно и молодежно: один могучий потуг — и штаны стали теплыми система уже на микросервисах. Но где же в этом чудном плане хранится подвох? Давайте попробуем разобраться.
Сложность в оценке продолжительности работы. Из-за множества подводных камней и непредвиденных факторов точно оценить сроки переезда на новую архитектуру будет очень проблематично. Соответственно переезд может затянуться на неопределенный срок.
![Еще чуть-чуть и мы переехали на микросервисы Еще чуть-чуть и мы переехали на микросервисы](https://habrastorage.org/getpro/habr/upload_files/28d/8e4/f83/28d8e4f836ca433f75714daea7d2e6fa.gif)
Сложность коллаборации большого количества программистов. Одной из причин перехода на микросервисы может быть сильно возросший штат на проекте. Как следствие сложность коллаборации и внедрения новых технологий (блокировки MR, деплой на каждый чих и т.д.). Даже если мы правильно разбили коллектив - резать всё за раз будет похоже на басню "Лебедь, рак и щука". Множество merge request'ов, перекрывающихся задач и сбоев могут сильно замедлить работу
Риск забросить. Маловероятно, но если все затянется очень сильно и не будет виден какой-то результат, лавочку могут прикрыть.
Остановка новых фич. Внедрение новых возможностей будет заблокировано на неопределенный срок. Это риск потерять пользователей и клиентов. Бизнес не может позволить себе паузу на месяцы или даже годы ради перехода на новую архитектуру. Убытки растут, а к миграции добавляются еще и финансовые проблемы. С другой стороны, в случае неудачи это будет шикарной возможностью найти себя на другом проекте, ну или открыть гусиную ферму
![Возможно он все 22 года пытался перейти на микросервисы с монолита, кто знает... Возможно он все 22 года пытался перейти на микросервисы с монолита, кто знает...](https://habrastorage.org/getpro/habr/upload_files/c74/ebe/b97/c74ebeb97445e47042aef7a1a4e015fb.png)
С другой стороны подход "по частям" гораздо более жизнеспособный. Суть его, как понятно из названия, заключается в поэтапной миграции. Вместо того, чтобы ломать систему целиком, вы постепенно выделяете отдельные компоненты и превращаете их в микросервисы. Остается дело за малым - определить приоритеты и те самые компоненты для микросервизации.
Мы, конечно же, можем как всегда кинуть монетку и случайно выбрать кусок кода для вынесения его в новую архитектуру. План, конечно, хорош но лучше подстраховаться и рассмотреть еще несколько способов. Итак, куда направить свой зоркий взгляд?
Область, где чаще всего происходит изменение кода. Миграция кода где изменения никогда не требуются - идея крутая, но не жизнеспособна. Зачем делать приоритет на то, что никогда не меняется и прекрасно работает. Нужно мыслить наоборот и смотреть на ту часть системы, которая постоянно дорабатывается и обновляется. Чем чаще происходят изменения, тем больше проблем вызывает процесс обновления всего монолита. Выделив эту часть в микросервис, можно упростить разработку и мердж реквесты, сократить частоту деплоя и
сохранитьсократить количество багов. Теперь данный участок будет независимо деплоиться и обновляться.Область, требующая наибольшей масштабируемости. Если есть участки системы, на которые приходится основная нагрузка - имеет смысл вынести их в первую очередь. Это улучшит масштабируемость и повысит отказоустойчивость. Также это позволит сократить нагрузку на основной сервер. При необходимости можно купить несколько небольших серверов и разбить нагрузку между ними через Load Balancer. При монолите это также возможно - но цена вопроса существенно дороже. Да и технически это существенно сложнее.
-
Область с наименьшим техническим долгом. Также начинать миграцию можно с тех компонентов, где наименьшее количество "костылей". Это позволит сократить количество нервных клеток при переходе на новую архитектуру.
Из плюсов данного подхода можно выделить
Нет жесткого дедлайна: переход можно проводить постепенно, не торопясь и не выжигая все ресурсы команды. Работа продолжается в нормальном режиме.
Видимый прогресс: каждый успешно мигрированный компонент — это ощутимый результат для команды и бизнеса.
Бизнес не страдает: поскольку процесс миграции идет параллельно с разработкой новых функций, бизнес продолжает развиваться и платить вам денежку.
Процесс миграции
Слышали ли вы что-либо об strangler fig? Звучит как название крутого блокбастера но на самом деле это вид тропических и субтропических растений, которых объединяет специфический «душащий» образ жизни. Если интересны детали - фикусы-душители. По аналогии с таким поведением Мартин Фаулер (Martin Fowler) создал шаблон программирования strangler pattern. Суть его проста - мы "обвиваем" старый код и начинаем выносить из него куски. Рассмотрим детальнее:
![](https://habrastorage.org/getpro/habr/upload_files/056/b56/a96/056b56a96b78f2f34de494a72c5dd12c.png)
Для начала необходимо создать фасад для пользователей с целью перенаправления запросов на новые микросервисы.
![](https://habrastorage.org/getpro/habr/upload_files/1d3/ca0/6e8/1d3ca06e820a10e7783e432447ead602.png)
Далее определяем область с наивысшим приоритетом и выносим данный функционал в отдельный микросервис.
![](https://habrastorage.org/getpro/habr/upload_files/4cf/a93/227/4cfa932276cdd2c6447651de5a92403e.png)
Перенаправляем запросы из вынесеной области в новый блок кода. При этом старый участок удалять не рекомендуется:
Процесс переноса может иметь новые баги. Процесс починки займет какое-то время а сервис должен работать.
Всегда хорошо иметь возможность вернуть все как было без существенных усилий
![](https://habrastorage.org/getpro/habr/upload_files/26e/5ed/e28/26e5ede2810efb677cbc68f0d698ab97.png)
Повторяем процесс.
![](https://habrastorage.org/getpro/habr/upload_files/246/97f/d82/24697fd82468d32de37c05e8bd67416b.png)
По итогу полностью переходим на новую архитектуру. Profit.
Советы
Оставить стек без изменений. Если у вас была реляционная база дынных - оставьте ее. Использовали java? Во-первых - мое уважение, а во вторых - продолжаем также делать до полного перехода на микросервисы. В противном случае рискуете создать себе несколько неожиданных проблем. Помните золотое правило: "Работает - не трогай".
Не спешите рефакторить. Сначала полностью перенесите всю архитектуру иначе рискуете откусить больше чем проглотить. Причины все те же.
Чем больше тестов - тем лучше. Очень важно понимать, что в процессе переноса мы не создали новых багов и полностью совместимы с другими частями приложения.
Определить API. Заранее продуманные интерфейсы между микросервисами помогут избежать путаницы и сбоев при взаимодействии компонентов. Семь раз отмерь - один отрежь.
Изолировать компонент: Все внутренние зависимости должны быть вынесены из кода, чтобы каждый микросервис мог работать независимо от других частей системы. Другими словами - микросервис должен быть на столько обособленным на сколько это возможно.
На этом, пожалуй, все. Пишите комментарии - всегда интересно почитать на сколько я тупой и вообще все что написано - ересь. Ну а в следующей части мы поговорим о базах данных в микросервисах.
Комментарии (11)
rukhi7
12.09.2024 16:26+2я много раз так делал, но не знал что этому методу придумали такое странное название.
Но вы изобразили слишком примитивную схему, фактически вырожденный случай, на практике все маленько (хотя в большинстве случаев - гораздо) сложнее, полная схема должна выглядеть примерно так:
Дело в том что практически нет шансов что Old Component не взаимодействует с остальным кодом приложения поэтому это взаимодействие тоже придется перенаправить и это самая боьшая сложность в реализации этого метода рефакторинга. Вот я уже смотрю на мою картинку с дополнениями и вижу что она тоже не полная.
вам в любом случае плюс за то что подняли интересную тему!
rukhi7
12.09.2024 16:26Чем больше тестов - тем лучше. Очень важно понимать, что в процессе переноса мы не создали новых багов и полностью совместимы с другими частями приложения.
а это похоже на какой-то подростковый максимализм, при этом это очень распространненное заблуждение. Обычно после какого-то оптимального (тут кстати очень уместно математическое: необходимого и достаточного) количества тестов, дальнейший рост этого количества тестов приводит к тому, что вы будете не в состоянии осмыслить результаты тестирования, просто потому, хотя бы, что в процессе осмысления второй четверти (например) этих результатов, вы забудете что вы поняли в первой четверти.
Короче говоря если без какого-то теста можно обойтись - это мусорный тест, если вы не знаете точно сколько вам нужно тестов (необходимо и достаточно) с большой вероятностью вы плодите мусорные тесты, и значит неэффективно расходуете ресурсы.
mylovtp Автор
12.09.2024 16:26Все так. Моя статья не детальная инструкция а скорее общие сведения. В каждом отдельном случае всегда будут свои нюансы
AlexCzech01
12.09.2024 16:26Начинать надо с инфраструктурных вещей (шаблоны, CI/CD, авторизация, протоколы), иначе авторы разных микросервисов первым делом нагородят разных решений для одного и того же исходя каждый из своего чувства прекрасного. И через несколько лет, когда картинка должна начать сходится, будет прямо очень больно. Это опыт из практики, в теории никто не видит в этом проблемы, мол пусть расцветают все цветы. Но этот подход годится только для реально больших организаций, в организации более обозримого размера зоопарк не окупается
Agrafar
12.09.2024 16:26Спасибо большое за статьи!
Смеялся в голос с "
Сильно тормозить и доставлять не те товары что были выбраны --> Main Core Service"Очень легко и приятно читается такой стиль)
Мое уважение всем шуткам за 300 и даже за 299.99 *приподнимаю шляпу *
Сухого изложения мне хватает и в документации на своих проектах)
rst07
Чётко, спасибо, прочитал обе части за раз!