Микросервисы для тех, кто прикидывается разработчиком. Часть 2

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

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

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

Еще чуть-чуть и мы переехали на микросервисы

Еще чуть-чуть и мы переехали на микросервисы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

056b56a96b78f2f34de494a72c5dd12c.png

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

1d3ca06e820a10e7783e432447ead602.png

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

4cfa932276cdd2c6447651de5a92403e.png

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

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

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

26e5ede2810efb677cbc68f0d698ab97.png

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

24697fd82468d32de37c05e8bd67416b.png

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

Советы

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

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

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

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

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

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

© Habrahabr.ru