Как была организована архитектура микросервисов на предыдущем проекте?

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

Ответ

Архитектура следовала принципам предметно-ориентированного проектирования (DDD), обеспечивая слабую связность и высокую степень автономности сервисов.

Основные характеристики:

  • Декомпозиция по доменам: Сервисы соответствовали бизнес-доменам (user-management, order-processing, payment-service).
  • Автономность: Каждый сервис владел своей схемой БД (использовались PostgreSQL, MongoDB) и развертывался независимо.
  • Стили коммуникации:
    • Синхронная: REST API и gRPC для прямых запросов-ответов.
    • Асинхронная: Брокер сообщений RabbitMQ (позже Kafka) для событий (user.registered, order.placed), обеспечивая слабую связность.
  • Инфраструктура: Оркестрация через Kubernetes с Helm-чартами, service mesh (Istio) для управления трафиком и безопасности.
  • Наблюдаемость: Единый стек: Prometheus (метрики), Grafana (дашборды), Jaeger (трассировка), Loki (логи).

Пример автономного теста сервиса (pytest):

# Тест изолирован от других сервисов благодаря мокам
def test_create_user_unit(user_service, mock_db_session, mocker):
    """Тест бизнес-логики создания пользователя."""
    # Мок внешней зависимости (например, сервиса нотификаций)
    mock_notify = mocker.patch("services.notification_client.send")

    new_user_data = {"email": "test@example.com", "name": "Test"}
    result = user_service.create_user(new_user_data)

    assert result.id is not None
    assert result.email == new_user_data["email"]
    # Проверка, что побочный эффект (нотификация) был вызван
    mock_notify.assert_called_once()

Сложности и решения: Для обеспечения согласованности данных в распределенных транзакциях применялся Паттерн Сага (Saga Pattern). Отладка упрощалась за счет сквозных идентификаторов запросов (correlation IDs) в логах и трассировках.