Microservice Patterns

Проработать

  1. Saga vs Two face commit
  2. A pattern language for microservices
  3. Архітектурні Патерни у Сучасних Мікросервісах - Java: Про ІТ під каву - #36
  4. Собеседование на Сеньора | Проектирование архитектуры систем | Systems Design
  5. Как подготовиться и пройти System Design Interview. Александр Поломодов
  6. Service Discovery в распределенных системах на примере Consul. Александр Сигачев
  7. Знакомимся с Event Sourcing. Часть 1
  8. Что спрашивают о микросервисах в крупных компаниях | Senior Developer | Jetbulb
  9. Стратегии обработки ошибок: Circuit Breaker pattern
  10. Circuit Breaker паттерн
  11. Шпаргалка по миграции монолита на микросервисы
  12. Database per Microservice паттерн
  13. Top 7 Ways to 10x Your API Performance
  14. API Gateways in System Design Interviews w/ Ex-Meta Staff Engineer
  15. Saga

  16. Как управлять транзакциями в микросервисной архитектуре
  17. Saga паттерн и распределенные транзакции

Основные разделы

System Design Interview

  1. Узнать все требования.
  2. Количество юзеров.
  3. Функциональные требования.

Решение проблем

Durability

Сервис упал, сеть оборвалась, брокер перегружен, сообщение потерялось или выполнилось дважды. Уменьшение риска каскадных отказов.

Поддержка транзакций между микросервисами.

Симметричное распределение нагрузки и сложности бизнес-логики.

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

Прокси сервера(Proxy):

  1. Прямой прокси(Forward Proxy) - используется клиентом, таким как веб-браузер. Клиент знает за этот прокси и осознанно его использует для обхода блокировок и других задач. Используется для сокрытия работы пользователя.
  2. Обратный прокси(Reverse proxy) - используется сервером, таким как веб-сервер. Клиент не знает за этот прокси и не осознанно его использует для распределения нагрузок, дополнительной защиты, кэширования и тд. Используется для сокрытия работы сервера.

Для чего используется

Имплементации

Load Balancing

Load Balancing - это Reverse proxy который делает только одну вещь - распределение запросов на несколько серверов.

Для чего

Алгоритмы

Примеры

API Gateway

API Gateway - единая точка входа для клиентов к микросервисам.

Примеры

Saga

Saga - если мы используем паттерн "Database per Microservice" нам нужно обеспечить согласованность данных между сервисами. Управляет распределёнными транзакциями без глобальной блокировки.

Каждый сервис выполняет транзакцию в своей базе и публикует событие.

Ошибки обрабатываются компенсирующими транзакциями.

Реализуется через хореографию или оркестрацию.

Способы координации саг:

Хореография(Choreography)

Хореография(Choreography) - каждая транзакция публикует события, которые запускают транзакции в других сервисах.

Будут выполнены следующие шаги:

  1. Order Service (Сервис Заказа) создает Order (Заказ) в статусе pending (в ожидании) и публикует событие OrderCreated (ЗаказСоздан).
  2. Customer Service (Сервис Клиента) получает событие и пытается зарезервировать кредит для заказа. После чего публикует одно из двух событий: CreditReserved (КредитЗарезервирован) или CreditLimitExceeded (КредитныйЛимитПревышен).
  3. Order Service (Сервис Заказа) получает событие и изменяет состояние заказа в approved (подтвержден) или cancelled (отменен).

Оркестровка (Orchestration)

Оркестровка(Orchestration) - оркестратор говорит участникам, какие транзакции должны быть запущены.

Будут выполнены следующие шаги:

  1. Order Service (Сервис Заказа) создает Order (Заказ) в статусе pending (в ожидании) и создает CreateOrderSaga (СагаСозданияЗаказа).
  2. CreateOrderSaga (СагаСозданияЗаказа) отправляет команду ReserveCredit (ЗарезервироватьКредит) в Customer Service (Сервис Клиента)
  3. Customer Service (Сервис Клиента) пытается зарезервировать кредит для заказа и отправляет назад ответ
  4. CreateOrderSaga (СагаСозданияЗаказа) получает ответ и отправляет ApproveOrder (ПодтвердитьЗаказ) or RejectOrder (ОтменитьЗаказ) команду в Order Service (Сервис Заказа)
  5. Order Service (Сервис Заказа) изменяет состояние заказа в approved (подтвержден) или cancelled (отменен)

Command and Query Responsibility Segregation(CQRS)

CQRS — это стиль архитектуры, в котором операции чтения отделены от операций записи.

Решает проблему - не симметричное распределение нагрузки и сложности бизнес-логики на read(Query) и write(Command) - подсистемы Большинство бизнес-правил и сложных проверок находится во write — подсистеме. При этом читают данные зачастую в разы чаще, чем изменяют.

Недостатки

Event sourcing

Event sourcing - архитектурный шаблон. Все изменения, вносимые в состояние приложения, сохраняются в той последовательности в которой они происходили.

Помогает эффективно распределять данные между микросервисами.

Преимущества:

Недостатки:

Database per Microservice

Database per Microservice - микросервисы не имеют доступа к базе соседних сервисов и обращаются между собой средством REST, или через message broker.

Преимущество

Недостатки

Retry pattern

Retry pattern - механизм повторения запросов.

Виды:

Circuit Breaker

pattern - защищает сервисы от избыточной нагрузки и отказов.

Помогает "Retry pattern" не добить нагруженный сервис количеством запросов.

Как работает:

  1. Замеряет ошибки – если система часто отвечает сбоем, то "выключает" запросы.
  2. Блокирует вызовы – на время переключается в режим отказа (open state).
  3. Пробует восстановиться – спустя время делает тестовые запросы и, если сервис снова работает, возвращает его в работу.

Timeout pattern

Timeout pattern - ограничивает время ожидания запросов.

Виды timeout:

Fallback pattern

Fallback pattern - запасное действие в случае ошибки.

Виды fallback:

Bulkhead pattern

Bulkhead pattern - используется для изоляции различных компонентов системы, чтобы сбои в одной части не затронули всю систему. Для повышения отказоустойчивости и изоляции сбоев.

Применение Bulkhead pattern:

Publisher–Subscriber(Pub/Sub)

Publisher–Subscriber (Pub/Sub) модель - архитектурный паттерн для обмена сообщениями между компонентами системы, где отправители сообщений (publishers) не знают о получателях (subscribers), а доставка обеспечивается через event bus / broker (например, Kafka, RabbitMQ, Redis Pub/Sub).

Основные идеи:

Преимущества:

Недостатки:

Реализации:

Features flag

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

Зачем они нужны?

Виды feature flags

Где хранятся флаги?

Минусы

Задача

Страховая компания предоставляет клиентам услуги по оформлению полисов.

Когда приходит запрос от клиента, нам нужно обратиться к сторонней SOAP-системе через HTTP, чтобы получить необходимые данные для расчёта.

По требованиям мы должны дать клиенту ответ в течение двух минут.

Если за это время расчёт не завершён — мы обязаны вернуть ошибку.

SOAP-система в среднем отвечает около 40 секунд, но работает нестабильно: иногда очень медленно, иногда вообще не отвечает.

Ожидаемая нагрузка — до 15 000 запросов в секунду, то есть система должна выдерживать высокий поток обращений и не зависеть от её нестабильности.

Решение

Задача 2

На e-commerce платформе в данный момент обрабатывает все операции (массовое создание и обновление заказов, поиск заказов клиентов, формирование сложных отчётов по продажам) через одну общую реляционную базу данных.

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

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

Вопросы

Какую ключевую архитектурную проблему этот пример демонстрирует в части работы с данными и почему единая модель данных не справляется?

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

Ответ

CQRS решает эту задачу за счёт разделения моделей и баз данных для записи и чтения.

Запись (заказы): команды обновляют выделенную нормализованную базу для записи (оптимизированную под транзакции).

Чтение (отчёты): события записи асинхронно обновляют отдельную денормализованную базу для чтения (оптимизированную под быстрые запросы и отчётность).

CQRS чаще всего реализуется с использованием брокера сообщений.