Перечислите и опишите архитектурные паттерны, используемые при разработке сервисов

«Перечислите и опишите архитектурные паттерны, используемые при разработке сервисов» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При разработке сервисов часто применяются следующие архитектурные паттерны:

  1. Микросервисная архитектура (Microservices) Приложение строится как набор небольших, независимо развертываемых сервисов, которые взаимодействуют друг с другом по сети (обычно через REST API или gRPC).

    • Преимущества: гибкость в выборе технологий, масштабируемость отдельных компонентов, отказоустойчивость.
    • Пример: Сервис пользователей, сервис заказов и сервис оплаты, каждый из которых является отдельным приложением на FastAPI или Flask.
  2. Событийно-ориентированная архитектура (Event-Driven Architecture, EDA) Компоненты системы взаимодействуют асинхронно через события. Один сервис (продюсер) генерирует событие, а другие (консьюмеры) на него подписываются и реагируют. Часто используется брокер сообщений (Kafka, RabbitMQ).

    • Преимущества: слабая связанность (loose coupling) сервисов, высокая масштабируемость.
    • Пример: Сервис заказов публикует событие OrderCreated, на которое подписываются сервисы уведомлений и логистики.
  3. CQRS (Command Query Responsibility Segregation) Разделение операций на две категории: команды (Commands), которые изменяют состояние системы, и запросы (Queries), которые читают данные. Это позволяет независимо оптимизировать и масштабировать операции чтения и записи.

    # Команда для изменения данных
    class PlaceOrderCommand:
        def __init__(self, user_id, items):
            # ... логика создания заказа
    
    # Запрос для чтения данных
    class UserOrdersQuery:
        def get_by_user_id(self, user_id):
            # ... логика получения заказов из оптимизированного для чтения хранилища
  4. Паттерн "Репозиторий" (Repository Pattern) Создание слоя абстракции между бизнес-логикой и источником данных (БД, API). Бизнес-логика работает с репозиторием, не зная деталей реализации хранения данных.

    • Преимущества: упрощает тестирование (можно подменить реальный репозиторий на mock), позволяет легко менять источник данных.
      class UserRepository:
      def get_by_id(self, user_id: int) -> User:
          # Логика получения пользователя из PostgreSQL
          ...
      def save(self, user: User):
          # Логика сохранения пользователя
          ...