Какие основные паттерны взаимодействия между микросервисами?

«Какие основные паттерны взаимодействия между микросервисами?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Взаимодействие между сервисами в микросервисной архитектуре строится через четко определенные API. Основные паттерны делятся на синхронные и асинхронные.

1. Синхронное взаимодействие (Request/Response)

Клиент отправляет запрос и ожидает ответа. Наиболее распространен протокол HTTP/REST.

Пример вызова REST API на Python:

import requests

# Клиентский сервис вызывает Users Service
response = requests.get('https://users-service.example.com/api/v1/users/123')
if response.status_code == 200:
    user_data = response.json()
    print(user_data['name'])

Плюсы: Простота, понятность. Минусы: Создает жесткую временную связь; отказ или медленный ответ одного сервиса блокирует вызывающий.

2. Асинхронное взаимодействие (через сообщения)

Сервисы обмениваются событиями через брокер сообщений (Kafka, RabbitMQ), не блокируя друг друга.

Пример публикации события в Kafka:

from kafka import KafkaProducer
import json

producer = KafkaProducer(bootstrap_servers='kafka-broker:9092',
                         value_serializer=lambda v: json.dumps(v).encode('utf-8'))

# Сервис заказов публикует событие
event = {"event_type": "ORDER_CREATED", "order_id": 456}
producer.send('order-events', value=event)

Плюсы: Отвязка сервисов, повышение отказоустойчивости и масштабируемости. Минусы: Усложнение архитектуры, необходимость гарантированной доставки, eventual consistency.

Критически важные аспекты:

  • Контракты: Использование спецификаций (OpenAPI, gRPC Protobuf) для строгого определения API.
  • Устойчивость: Реализация механизмов Retry, Circuit Breaker, Fallback для обработки сбоев.
  • Наблюдаемость: Сквозная трассировка (Distributed Tracing), централизованное логирование и метрики.