Skip to main content
Back to course
Архитектура высоконагруженных веб-приложений
11 / 11100%

Паттерны высокого трафика: выбор без самообмана

90 минут

Для кого: техлиды и системные архитекторы, которых задолбали советы «делайте микросервисы». Если вы уже строите highload, но не знаете, какой паттерн применить и когда — тут будет жёсткая таблица решений.

Провокация №1: вы можете доказать, зачем вам микросервисы?

  • Если ответ: «так делают все» — останавливайтесь. Микросервисы = дорого.
  • Правило: у вас должно быть хотя бы одно из: независимые команды, разные SLA по доменам, разные темпы обновлений, необходимость изолированного масштабирования.

1. Monolith vs Modular Monolith vs Microservices

КритерийМонолитМодульный монолитМикросервисы
Команда< 1010–3030+
SLAединыйдифференцируется медленноразные по сервисам
Release cadenceобщийавтономный модульнезависимые команды
Технический долграстёт быстроуправляется модулямираспределён (DevOps overhead)
Стоимость DevOpsнизкаясредняявысокая (k8s, observability)

Стратегия: начинайте с модульного монолита. Разбивайте модули, если есть фактическая боль.

Провокация №2: у вас есть API gateway? Зачем?

  • Gateway — не просто «reverse proxy». Он должен решать auth, rate limiting, observability, кэш.

2. API Gateway vs BFF

ПаттернКогдаПлюсыМинусы
API GatewayОбщий вход для всех клиентовцентрализованный auth, rate limitодин размер для всех, сложные трансформации
BFF (Backend for Frontend)разные клиенты (web, mobile)оптимизация payload, специфичные кэшибольше сервисов, синхронизация API

Правило: если клиенты сильно отличаются (mobile/web), делайте BFF поверх gateway.

Провокация №3: вы защищены от cascading failure?

  • Один медленный сервис может «утопить» всю систему. Circuit breaker и bulkhead должны быть включены по умолчанию.

3. Circuit Breaker

const breaker = new CircuitBreaker(callPaymentService, {
  timeout: 3000,
  errorThresholdPercentage: 50,
  resetTimeout: 10000,
});
  • Открытое состояние = возвращаем fallback/503.
  • Метрики: breaker_open_total.

3.1 Bulkhead

  • Разделяйте пул потоков/соединений. Пример: отдельный pool для платежей, другой для профиля. Если платежи падают, профиль живёт.

Провокация №4: у вас есть стратегия деградации?

  • Если одна функция умирает, что видит пользователь? Вы должны ответить: «мы отключаем рекомендации, но корзина работает».

4. Масштабирование по этапам

RPSАрхитектураКлючевые шаги
0–100Monolith + Postgresкэш в памяти, CDN для статики
100–1KМонолит + Redis + replicasAPI gateway, read replicas, async jobs
1K–10KМодульный монолит / микро-сервисы для горячих зонsharding, queues, BFF, circuit breakers
10K+Микросервисы, multi-regionCQRS, event sourcing, стратегическое шардирование

Провокация №5: есть ли у вас playbook по переходу?

  • Нельзя «просто выделить сервис». Нужен план миграции.

5. Миграция из монолита в сервис

  1. Определите bounded context: чёткие границы домена.
  2. Стандартизируйте интерфейс: модуль должен иметь public API.
  3. Создайте анти-коррупционный слой: слой адаптеров.
  4. Вырежьте в отдельный deploy: сначала как модуль (feature flag), потом как сервис.
  5. Обеспечьте мониторинг: метрики до/после.

Провокация №6: вы знаете Anti‑Patterns?

  • Distributed monolith: сервисы обращаются напрямую к БД друг друга.
  • Shared DB: все микросервисы в одной схеме.
  • Chatty services: сотни RPC для одного запроса.

Провокация №7: вы документируете архитектуру?

  • ADR (Architectural Decision Records) — обязательны. Нельзя «устно» решать.

ADR пример

# ADR-007: Use Kafka for Order Events
Date: 2024-02-01
Context: Need to decouple order processing from notifications.
Decision: Introduce Kafka topic `order-events`, at-least-once delivery.
Consequences: Need idempotent consumers, new team for platform.

Провокация №8: вы проверяете архитектуру тестами?

  • Architecture fitness functions: тесты, что сервисы не нарушают правила (e.g., payments не может импортировать orders напрямую).
import { enforceModuleBoundaries } from "@nx/workspace";

Практика

  1. ADR:
    • Создайте ADR для выбора между BFF и API Gateway.
  2. Circuit breaker:
    • Реализуйте circuit breaker + bulkhead в одном сервисе, симулируйте падение зависимости.
  3. Degradation:
    • Напишите документ «если сервис X падает — какие фичи отключаем».
  4. Migration plan:
    • Опишите шаги выделения модуля в сервис: data ownership, интерфейсы, тесты.
  5. Fitness function:
    • Добавьте тест/линтер, предотвращающий прямой импорт одного модуля в другой.

Безопасность: архитектурные изменения без ADR и approval — табу. Проверяйте impact (SLO, cost) до внедрения.

Что дальше

Вы дошли до финала. Теперь у вас есть набор паттернов, метрик, практик, чтобы масштабировать систему и не сойти с ума. Дальше — только практика и постмортемы.

🎉 Congratulations on completing the course!

Share your experience and get a promo code for free access to any premium material of your choice

Free access to any premium material of your choice

🎓

Your experience will help other students

📧

Promo code will arrive via email within 24 hours

Minimum 50 characters

0/50

Паттерны высокого трафика: выбор без самообмана — Архитектура высоконагруженных веб-приложений — Potapov.me