Case Study
Разбор реального кода
Курс не работает на BankAccount. Все разборы — на реальном Python-микросервисе (FastAPI + Dishka + FastStream + SQLAlchemy async), анонимизированном для публикации.
Что за сервис
Анонимизированный микросервис обработки товарных позиций. Получает OrderItemMessage
из RabbitMQ, отправляет характеристики во внешний marketplace-api для
нормализации, сохраняет результат в PostgreSQL, публикует событие для сервиса
подбора аналогов (matcher-service).
Архитектура — Hexagonal (Ports & Adapters). Domain layer формально пустой — сервис-оркестратор без rich model.
Разборы
- Антипаттерн
Mapper внутри use case
Use case знает про формат внешнего consumer (matcher-service). Утечка транспортного контракта в бизнес-слой. Разбираем, как вынести в OutgoingMessageMapper.
обсуждается в: clean-architecture, repository-pattern
- Наблюдение
Пустая папка domain/
Классический anemic model в микросервисе-оркестраторе. Приемлемо для простых сценариев. Признаки, что уже пора вводить domain layer.
обсуждается в: clean-architecture
- Антипаттерн
Двойная запись без Outbox
repository.save() + event_publisher.publish() без атомарности. При падении между шагами теряется событие или расходятся хранилища. Разбор с рефакторингом через Outbox.
обсуждается в: repository-pattern
- Наблюдение
Транзакция внутри репозитория
session.begin() спрятан в методе Repository. Нельзя объединить с другими операциями в одну транзакцию. Правильно — Unit of Work на уровне use case.
обсуждается в: repository-pattern
- Хороший пример
Port через Python Protocol
Structural subtyping (PEP 544) вместо ABC даёт чистый Port без наследования. Реализация не декларирует зависимость от интерфейса — что и есть смысл инверсии.
обсуждается в: clean-architecture, repository-pattern
- Хороший пример
Composition root на Dishka
Все bindings port→adapter собраны в одном месте, use case не знает про инициализацию инфраструктуры. Хороший пример явного DI без Service Locator.
обсуждается в: clean-architecture
Полный разбор с построчными комментариями будет во второй волне курса. Сейчас ключевые фрагменты вплетены в главы 02 и 03.