Обложка: Стоит прочитать: обзор книги Сэма Ньюмана «Monolith to Microservices. Evolutionary patterns to transform your monolith»

Стоит прочитать: обзор книги Сэма Ньюмана «Monolith to Microservices. Evolutionary patterns to transform your monolith»

Антон Ярков

Антон Ярков

руководитель команды разработчиков в компании Access Softek Inc.

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

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

Книга «Monoliths to Microservices» основательно покрывает вопросы выбора архитектуры, определения шагов перехода и в деталях описывает паттерны миграции баз данных, компонент приложений и инфраструктуры. Она будет полезна как разработчикам и архитекторам, так и CTO и Engineering Manager’ам. Топ менеджерам и людям из бизнеса будет полезно ознакомиться с первыми двумя главами, посвящёнными непосредственно организации миграции архитектуры.

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

Далее обсуждаются вопросы, на которые должна ответить команда, чтобы точно определиться нужен ли вообще переход на микросервисную архитектуру. Ведь переход означает не только переписывание кодовой базы, но и соответствующие изменения в структуре организации. В книге объясняются такие важные понятия как «отменяемые и неотменяемые изменения» (irreversible and reversible changes), «количественные и качественные метрики» (quantitative and qualitative measures), «предметно-ориентированное проектирование» (Domain Driven Design), общеизвестные дизайн паттерны и термины, а также условия, в которых такой переход может привести к неоднозначным последствиям как в коде, так и в бизнесе компании.

В дальнейшем автор описывает эффективные способы постепенной, но не мгновенной миграции, что скорее всего необходимо в 99% существующих продуктов с монолитной архитектурой. Сначала необходимо выбрать какие части системы стоит переносить первыми, и тут читателю даётся вариант совместного мозгового штурма (Event storming) с командой для приоритезации компонентов миграции. Учитываются многие факторы, такие как «важность для бизнеса», «готовность к переходу», «навыки и структура команды», а также приводятся примеры возможных временных рамок того или иного изменения, что всегда существенно с точки зрения бизнеса.

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

Для разделения компонент системы, «общающихся» по сети, детально описан паттерн Strangler Fig во всех вариантах реализации: с маршрутизацией через Proxy и Reverse Proxy, с использованием различных протоколов и перехватом сообщений. Для практически каждого проекта пригодятся паттерны Branch By Abstraction и Parallel Run. Не забыты паттерны Decorating Collaborator и Change Data Capture. Конкретно для миграции UI части описаны паттерны UI Composition и Micro Frontends. Все они приведены с примерами, так что будет достаточно просто применить их у себя на проекте.

Отдельного внимания заслуживает глава про паттерны миграции баз данных: описываются самые распространённые способы разделения (на уровне схемы, инстансов и таблиц), а также решения по синхронизации данных, вопросы консистентности (data consistency) и паттерны её достижения. Детально обсуждаются варианты реализации транзакций в распределённых системах, а также описывается паттерн Сага (Saga), как альтернативный вариант для борьбы со сложностью и слабыми сторонами распределенных транзакций.

И конечно, отдельная часть книги посвящается инфраструктуре вокруг микросервисов: вопросам масштабирования архитектуры, логирования и мониторинга, управления жизненными циклом сервисов и работоспособностью продуктов. Упоминаются, хотя, как мне кажется, не в полной мере раскрыты вопросы использования Service Mesh и Kubernetes, а также End-To-End тестирования, но для этого, наверное, нужно писать отдельную книгу.

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