Микросервисы

Микросервисы #

1. Монолит vs Микросервис #

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

Плюсы и минусы монолитов?

Плюсы:

  • Не надо настраивать взаимодействие(Kafka например)
  • Нет проблем с транзакциями в БД в отличии от микросервисов
  • Выше производительность
  • Простое развертывание для девопса
  • Проще тестировать, т.к. монолит проще поднять нежели 10-ки микросервисов

Минусы:

  • Если упадет монолит, то упадут все его части
  • Долгая сборка тестов
  • При увеличении нагрузки, приходится масштабировать всё приложение целиком, даже если проблема только в одной его части
  • Сложность добавления нового функционала, т.к. надо понимать как компоненты работают, чтобы где то не упало что то
  • Сложно добавлять новые технологии, потому что все взаимосвязано

Плюсы и минусы микросервисов?

Плюсы:

  • Проще влиться в проект - не надо понимать весь проект
  • Проще протестировать конкретный микросервис
  • Отказоустойчивость – если упал какой-нибудь сервис, остальные продолжат работать
  • Легче пробовать новые технологии, переписав один сервис, а не весь монолит
  • Можно масштабировать только те сервисы, которые под нагрузкой, не трогая остальные

Минусы:

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

2. Паттерн Saga в микросервисной архитектуре #

Saga — это паттерн для управления распределёнными транзакциями в микросервисах. Он разбивает глобальную транзакцию на последовательность локальных транзакций, каждая из которых выполняется в рамках одного сервиса.

Решает проблему распределённых транзакций (которые отрабатывают в разных системах), чтобы при ошибке в одной из транзакций был rollback во всех

Плюсы SAGA

ПлюсОписание
ГибкостьПозволяет работать с распределёнными транзакциями без блокировок баз данных.
ОтказоустойчивостьПри сбоях можно выполнить компенсационное действие вместо отката всей транзакции.
МасштабируемостьСервисы работают независимо друг от друга, повышая масштабируемость системы.
Независимость сервисовНет необходимости в общей базе данных, каждый сервис может использовать собственное хранилище.
Подходит для долгих операцийЛокальные транзакции могут быть выполнены асинхронно и растянуты во времени

Минусы SAGA

МинусОписание
Сложность реализацииНеобходимо тщательно продумать порядок шагов и компенсационные действия.
Не атомарностьРезультаты промежуточных шагов видны другим сервисам, даже если последующие шаги завершатся сбоем.
Неявная согласованностьДанные могут быть несогласованными в течение выполнения всей цепочки.
ЗадержкиАсинхронные процессы могут увеличить время завершения транзакции.
Необходимость оркестрацииТребует использования системы оркестрации (например, Orchestrator Saga) или управления событиями (Choreography Saga).

Какие способы координации транзакций в Sag-e?

Для координации транзакций существует два основных способа:

  • Хореография. Микросервисы сами обмениваются событиями между собой. Каждый сервис реагирует на события другого и выполняет свою локальную транзакцию, создавая новое событие для следующего сервиса
  • Оркестрация. Есть один “управляющий” сервис, который следит за процессом. Он говорит каждому микросервису, что делать, и следит за успешностью каждого шага

Какие типы транзакций существуют в Sag-е (Компенсирующая, компенсируемая, поворотная, повторяемая)

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

3. CAP теорема #

CAP теорема гласит, что система может обладать лишь двумя из следующих трех свойств:

  • C - Согласованность (Consistency). Данные во всех сервисах не противоречат друг другу
  • A - Доступность (Availability). Система продолжает работу даже при частичном отказе сервисов
  • P - Устойчивость к разделению (Partition Tolerance). Система продолжает работу при частичной потере коммуникации между сервисами

4. Паттерн Circuit Breaker #

Он мониторит вызовы к внешнему сервису и при обнаружении большого количества неудачных попыток временно “отключает” вызов, предотвращая падение всей системы. Circuit Breaker основывается на трех состояниях: закрытоеоткрытое и полуоткрытое

  • Закрытое. Всё нормально, запросы проходят к сервису
  • Открытое. Если ошибки становятся слишком частыми, Circuit Breaker перестаёт направлять запросы к проблемному сервису
  • Полуоткрытое. После некоторого времени Circuit Breaker отправляет несколько тестовых запросов. Если всё нормально - он переходит в закрытое состояние. Если нет — остаётся в открытом состоянии

5. Паттерн API Gateway #

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


6. HTTP vs Kafka. Какой способ общения между микросервисами лучше и почему? #

КритерийHTTPKafka
Тип взаимодействияСинхронное (запрос-ответ).Асинхронное (публикация и подписка на события).
Надёжность передачи данныхНет встроенного механизма повторной доставки запросов.Сообщения сохраняются и доставляются даже при сбоях потребителей.
ПроизводительностьОграничено количеством одновременных запросов и доступностью сервисов.Высокая производительность при обработке больших объёмов сообщений.
Простота реализацииЛегко реализовать с использованием стандартных библиотек и протоколов.Требуется дополнительная настройка брокеров, топиков и клиентов.
ЗадержкиМинимальные, так как ответ приходит сразу после запроса.Возможны задержки из-за асинхронной обработки сообщений.
Независимость сервисовСервисы зависят от доступности друг друга (сервис-отправитель и сервис-получатель).Полная независимость сервисов: отправитель не знает о состоянии получателя.
МасштабируемостьОграничена синхронным взаимодействием и увеличением числа клиентов.Хорошо масштабируется для работы с высокими нагрузками.
Поддержка событийностиНе подходит для событийной архитектуры.Предназначен для работы с событиями (обработка, хранение, ретрансляция).
СовместимостьПоддерживается практически всеми языками программирования и библиотеками.Требуется поддержка Kafka-клиентов для различных языков.
Устойчивость к сбоямЕсли один сервис недоступен, запрос не может быть обработан.Сообщения сохраняются в очереди, пока не будут обработаны.
  • Использовать HTTP, если:

    • Нужно немедленное подтверждение результата (например, авторизация, выполнение команды).
    • Система проста и не требует сложной обработки сообщений.
  • Использовать Kafka, если:

    • Требуется высокая производительность и масштабируемость.
    • Сервисы должны быть независимыми и работать асинхронно.
    • Важна надёжность передачи данных и минимизация влияния сбоев.

Идеальный подход — гибридное использование:

  • Для взаимодействия в реальном времени применять HTTP.
  • Для событийной модели и обработки больших объёмов данных — Kafka.

7. Шаблоны проектирования для микросервисов (паттерны) #

ПаттернКатегорияКраткое описаниеКогда применять
API GatewayИнтеграцияЕдиная точка входа, маршрутизация запросов к микросервисамКогда нужно скрыть внутренние URL и объединить контракты
Service DiscoveryИнфраструктураАвтоматическая регистрация и поиск сервисов в кластереПри динамическом масштабировании и частых перезапусках
Circuit BreakerНадёжностьОстанавливает вызовы к недоступному сервису, даёт ему восстановитьсяДля хрупких удалённых зависимостей с переменной доступностью
RetryНадёжностьПовторная попытка выполнения неудачных запросовПри кратковременных сетевых или инфраструктурных сбоях
BulkheadНадёжностьИзоляция ресурсов (пулы потоков, соединений) для каждого сервисаЧтобы сбой одного функционала не «затопил» весь сервис
SagaТранзакцииУправление распределёнными транзакциями через последовательность локальных операций и компенсацииКогда нужны данные в нескольких сервисах с откатом изменений
CQRSМоделирование данныхРазделение команд (write) и запросов (read) на разные модели и сервисыПри высоких требованиях к производительности чтения
Strangler FigРазвёртываниеПостепенный перенос функциональности старой системы в микросервисыМиграция монолита на микросервисы шаг за шагом
SidecarИнфраструктураСоседний процесс рядом с сервисом, предоставляющий кросс-функциональные возможности (логирование, прокси)Для единообразной маршрутизации, безопасности, телеметрии
AmbassadorИнфраструктураПрокси/агент, выступающий «послом» сервиса, осуществляющий внешнюю интеграциюКогда нужно вынести внешние зависимости за границы сервиса