Как вы разделяли микросервисы на прошлом месте работы?

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

Ответ

Мы использовали подход, основанный на Domain-Driven Design (DDD) и принципах bounded context. Основные шаги:

1. Выявление доменов и контекстов:

  • Провели event storming-сессии с бизнес-аналитиками и разработчиками.
  • Выделили core domains (например, Order, Payment, Delivery, Catalog).
  • Определили границы контекстов, чтобы минимизировать связи между ними.

2. Критерии разделения на сервисы:

  • Бизнес-возможность: Каждый сервис отвечал за одну четкую бизнес-функцию (например, обработка платежей).
  • Независимое развертывание и масштабирование: Сервис Notification мог масштабироваться отдельно от Order в период распродаж.
  • Владение данными: У каждого сервиса была своя приватная база данных. Обмен данными шел только через публичные API или события.

3. Реализация коммуникации:

  • Синхронная (REST/gRPC): Для операций, требующих немедленного ответа (например, проверка наличия товара).
  • Асинхронная (Event-Driven через Kafka): Для обеспечения слабой связанности и надежности. Пример события:
    
    // Общий контракт события в отдельной библиотеке
    public class OrderPlacedEvent
    {
    public Guid OrderId { get; set; }
    public decimal TotalAmount { get; set; }
    public string CustomerEmail { get; set; }
    }

// Сервис Payment подписывался на это событие для запуска процессинга.



**4. Инфраструктурные решения:**
*   **Контракты:** DTO и события выносились в общие NuGet-пакеты.
*   **Мониторинг:** Централизованный сбор логов (ELK Stack) и метрик (Prometheus/Grafana) для каждого сервиса.
*   **Обнаружение сервисов:** Использовали Consul для динамической маршрутизации.

Главный урок: разделение должно быть по бизнес-границам, а не по техническим слоям (например, не делать отдельный сервис "База данных" или "Логика").