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

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

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

Еще чуть-чуть и мы переехали на микросервисы
Еще чуть-чуть и мы переехали на микросервисы
  • Сложность коллаборации большого количества программистов. Одной из причин перехода на микросервисы может быть сильно возросший штат на проекте. Как следствие сложность коллаборации и внедрения новых технологий (блокировки MR, деплой на каждый чих и т.д.). Даже если мы правильно разбили коллектив - резать всё за раз будет похоже на басню "Лебедь, рак и щука". Множество merge request'ов, перекрывающихся задач и сбоев могут сильно замедлить работу

  • Риск забросить. Маловероятно, но если все затянется очень сильно и не будет виден какой-то результат, лавочку могут прикрыть.

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

Возможно он все 22 года пытался перейти на микросервисы с монолита, кто знает...
Возможно он все 22 года пытался перейти на микросервисы с монолита, кто знает...

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

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

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

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

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

    Из плюсов данного подхода можно выделить

  • Нет жесткого дедлайна: переход можно проводить постепенно, не торопясь и не выжигая все ресурсы команды. Работа продолжается в нормальном режиме.

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

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

Процесс миграции

Слышали ли вы что-либо об strangler fig? Звучит как название крутого блокбастера но на самом деле это вид тропических и субтропических растений, которых объединяет специфический «душащий» образ жизни. Если интересны детали - фикусы-душители. По аналогии с таким поведением Мартин Фаулер (Martin Fowler) создал шаблон программирования strangler pattern. Суть его проста - мы "обвиваем" старый код и начинаем выносить из него куски. Рассмотрим детальнее:

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

Далее определяем область с наивысшим приоритетом и выносим данный функционал в отдельный микросервис.

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

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

  • Всегда хорошо иметь возможность вернуть все как было без существенных усилий

Повторяем процесс.

По итогу полностью переходим на новую архитектуру. Profit.

Советы

  • Оставить стек без изменений. Если у вас была реляционная база дынных - оставьте ее. Использовали java? Во-первых - мое уважение, а во вторых - продолжаем также делать до полного перехода на микросервисы. В противном случае рискуете создать себе несколько неожиданных проблем. Помните золотое правило: "Работает - не трогай".

  • Не спешите рефакторить. Сначала полностью перенесите всю архитектуру иначе рискуете откусить больше чем проглотить. Причины все те же.

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

  • Определить API. Заранее продуманные интерфейсы между микросервисами помогут избежать путаницы и сбоев при взаимодействии компонентов. Семь раз отмерь - один отрежь.

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

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

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


  1. rst07
    12.09.2024 16:26

    Чётко, спасибо, прочитал обе части за раз!


  1. Alex_SH2
    12.09.2024 16:26
    +1

    Статьи хорошие, но вот одного не могу понять - чего автор так привязался к Feng'у? Ну ушел себе человек гусей пасти, что тут такого? Все performance architect 'ы рано или поздно там оказываются :)


    1. mylovtp Автор
      12.09.2024 16:26

      Не могу не согласиться


  1. rukhi7
    12.09.2024 16:26
    +2

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

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

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

    вам в любом случае плюс за то что подняли интересную тему!


    1. mylovtp Автор
      12.09.2024 16:26

      Спасибо за уместное дополнение


  1. rukhi7
    12.09.2024 16:26

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

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

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


    1. mylovtp Автор
      12.09.2024 16:26

      Все так. Моя статья не детальная инструкция а скорее общие сведения. В каждом отдельном случае всегда будут свои нюансы


  1. yankie
    12.09.2024 16:26

    Я бы хотел иметь докумантацию по паттернам в таком стиле Ж)


  1. AlexCzech01
    12.09.2024 16:26

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


  1. Agrafar
    12.09.2024 16:26

    Спасибо большое за статьи!

    Смеялся в голос с "Сильно тормозить и доставлять не те товары что были выбраны --> Main Core Service"

    Очень легко и приятно читается такой стиль)

    Мое уважение всем шуткам за 300 и даже за 299.99 *приподнимаю шляпу *

    Сухого изложения мне хватает и в документации на своих проектах)


  1. farvolaeth
    12.09.2024 16:26

    Спасибо, было познавательно и смешно,
    буду ждать новых статей!