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

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

Для того чтобы сервисы в распределенной системе могли эффективно функционировать, они должны быть максимально независимы и поддерживать возможность обновления без взаимных зависимостей. Неправильное проектирование может привести к тому, что сервисы окажутся тесно связаны, что усложнит их обновление и потребует координации между командами. Вместо объединения сервисов в один, что может быть ресурсоемким, можно использовать подход обратной совместимости. Например, при добавлении нового поля в систему сначала оно может быть опциональным, что позволит сервисам обновляться постепенно без простоев. Этот метод, известный как развертывание без простоя (zero downtime deployment), хотя и усложняет процесс релиза, позволяет минимизировать ошибки после обновления.

Распределенные транзакции

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

Сокращение сетевого трафика между сервисами и обеспечение надежности обработки запросов

Уменьшение сетевого трафика между сервисами критически важно для повышения производительности системы. Переход с текстового формата обмена данными на бинарный, с использованием таких фреймворков, как gRPC и Apache Thrift, может значительно сократить объем передаваемых данных и упростить интеграцию между сервисами. Также такие фреймворки, как gRPC, могут предоставить нам такие возможности, как потоковая обработка данных и способы более гибкой балансировки нагрузки и т. д. Основным недостатком этого подхода является сложность интеграции с веб-приложениями и необходимость поддержки отдельного API для них, а также потенциальные трудности с освоением новых технологий командой разработчиков. Для обеспечения надежного взаимодействия между сервисами стоит подумать о таких подходах, как механизм повторных запросов в случае сетевых ошибок, например моргания сети, временной недоступности сервисов и т. д. Также нам может помочь механизм cuircut breaker («переключатель цепи»). Он используется для обнаружения сбоев и содержит логику предотвращения постоянных ошибок, во время технического обслуживания, временного внешнего сбоя системы или неожиданных трудностей в работе системы. Для поиска узких мест при обработке мы можем использовать средства трейсировки запросов, который могут найти узкие места в производительности.

Вывод

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

Дмитрий Антонов, бывший главный разработчик/техлид Wildberries и Sber