← [Раздел](README.md) · [Главная](../README.md)

# Антипаттерны и архитектурные smells

## Цель

Узнавать **распространённые ошибки** облачной архитектуры на ранней стадии: distributed monolith, chatty microservices, god service, «умный» gateway и другие smells — с конкретными симптомами и способами лечения.

## Предварительно

- [Serverless и FaaS](serverless-i-faas.md)
- [Надёжность](../07-nadezhnost/README.md)

## Время

~55 минут

---

## Антипаттерн vs smell

| | Антипаттерн | Smell |
|---|-------------|-------|
| **Суть** | Известное плохое решение | Сигнал, что что-то не так |
| **Пример** | Distributed monolith | «Деплой одного сервиса требует 5 других» |

Smell — повод для рефакторинга или ADR, не всегда немедленная переделка.

---

## Distributed monolith

**Симптомы:**

- микросервисы, но **общая БД**;
- синхронные цепочки из 6+ вызовов на один клик;
- релизы синхронизированы «поездами»;
- нет изоляции данных.

**Лечение:** modular monolith или пересмотр границ; database per service; async; BFF вместо mesh-хаоса.

---

## Chatty microservices

**Симптом:** десятки HTTP-вызовов на один запрос пользователя.

| Проблема | Решение |
|----------|---------|
| N+1 между сервисами | Aggregate API / BFF |
| Детали домена наружу | DTO, не entity |
| Чтение из многих источников | CQRS read model (осознанно) |

Измеряйте: **fan-out** на trace в Jaeger.

---

## God service

Один сервис «знает всё»: заказы, пользователи, скидки, отчёты.

**Признаки:** repo > 100k строк, 50 инженеров в одном Slack-канале, любой баг — «в ордер-сервисе».

**Лечение:** выделение bounded context по **изменяемости** (что меняется вместе).

---

## Smart gateway / dumb services (перегиб)

API Gateway с бизнес-логикой, оркестрацией транзакций и правилами скидок.

**Правило:** gateway — auth, rate limit, routing, **тонкая** агрегация. Бизнес-логика — в доменных сервисах.

---

## Retry storm

Все сервисы retry без backoff на упавший downstream → **DDoS своими силами**.

См. [circuit-breaker-i-retry.md](../07-nadezhnost/circuit-breaker-i-retry.md).

---

## Shared cache как скрытая БД

Redis с ключами всех сервисов, без схемы владения. Один `FLUSHALL` — катастрофа.

**Лечение:** префиксы, TTL, владелец namespace, не хранить source of truth только в cache.

---

## «Микросервисы ради резюме»

15 сервисов, 3 пользователя, команда из 4 человек.

**Лечение:** честный ADR: consolidate до 2–3 сервисов или modular monolith.

---

## Big ball of mud в облаке

Legacy перенесли в k8s **как есть** — один pod, cron внутри, state на диске.

**Лечение:** 12-factor рефакторинг по частям; не «lift and shift» без изменений.

---

## Over-engineering observability

100 дашбордов, алерт на каждый чих, нет владельца.

**Лечение:** SLO-driven минимум; удалять шумные алерты ежемесячно.

---

## Таблица smells → действия

| Smell | Первый шаг |
|-------|------------|
| Деплой > 30 мин | Уменьшить blast radius, feature flags |
| p99 растёт с числом сервисов | Trace fan-out |
| Тесты только E2E | Пирамида + contract |
| Секреты в env без ротации | Vault + policy |
| Нет ADR | Зафиксировать текущие споры |

---

## Как проводить smell review

Раз в квартал 60 минут:

1. RED метрики топ-3 сервисов.
2. Самый длинный trace за неделю.
3. Один «болезненный» деплой — root cause.
4. Один ADR на улучшение.

---

## Самопроверка

1. Чем distributed monolith отличается от модульного монолита?
2. Что такое chatty microservices?
3. Где должна жить бизнес-логика — gateway или сервис?
4. Назовите симптом retry storm.

---

## Дальше

→ [Раздел 12 — Практикум](../12-praktikum/README.md)  
← [Serverless и FaaS](serverless-i-faas.md)
