Рано или поздно backend обрастает интеграциями: платежи, CRM, учётные системы, доставка. Если не договориться с собой о правилах — код быстро начинает жить по законам чужих API.
Несколько вещей, которые реально помогают не потерять контроль над архитектурой.
1. Anti-corruption layer
Не смешивайте доменные модели с ответами партнёров. Лучше выделить отдельный слой.
class PaymentGateway:
async def create_payment(self, dto: PaymentDTO) -> Payment:
...
Контракт у партнёра изменился — правки остаются в одном месте.
2. DTO как точка входа
DTO — удобное место для валидации и нормализации данных.
@dataclass
class PartnerOrderDTO:
external_id: str
total: Decimal
На этом этапе проще отфильтровать неконсистентные данные, чем ловить баги дальше в домене.
3. Idempotency
Повторы запросов — нормальная история для любой сети.
Idempotency-key или уникальный индекс часто спасают от дублей и лишних списаний.
4. Retry без фанатизма
Бесконечные retry под нагрузкой легко добивают зависимый сервис — а заодно и ваш.
Обычно хватает ограниченного числа попыток с backoff.
Чем меньше домен знает о чужих форматах, тем спокойнее переживаются изменения во внешних системах.
