Паттерны высокого трафика: выбор без самообмана
Для кого: техлиды и системные архитекторы, которых задолбали советы «делайте микросервисы». Если вы уже строите highload, но не знаете, какой паттерн применить и когда — тут будет жёсткая таблица решений.
Провокация №1: вы можете доказать, зачем вам микросервисы?
- Если ответ: «так делают все» — останавливайтесь. Микросервисы = дорого.
- Правило: у вас должно быть хотя бы одно из: независимые команды, разные SLA по доменам, разные темпы обновлений, необходимость изолированного масштабирования.
1. Monolith vs Modular Monolith vs Microservices
| Критерий | Монолит | Модульный монолит | Микросервисы |
|---|---|---|---|
| Команда | < 10 | 10–30 | 30+ |
| 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–100 | Monolith + Postgres | кэш в памяти, CDN для статики |
| 100–1K | Монолит + Redis + replicas | API gateway, read replicas, async jobs |
| 1K–10K | Модульный монолит / микро-сервисы для горячих зон | sharding, queues, BFF, circuit breakers |
| 10K+ | Микросервисы, multi-region | CQRS, event sourcing, стратегическое шардирование |
Провокация №5: есть ли у вас playbook по переходу?
- Нельзя «просто выделить сервис». Нужен план миграции.
5. Миграция из монолита в сервис
- Определите bounded context: чёткие границы домена.
- Стандартизируйте интерфейс: модуль должен иметь public API.
- Создайте анти-коррупционный слой: слой адаптеров.
- Вырежьте в отдельный deploy: сначала как модуль (feature flag), потом как сервис.
- Обеспечьте мониторинг: метрики до/после.
Провокация №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";Практика
- ADR:
- Создайте ADR для выбора между BFF и API Gateway.
- Circuit breaker:
- Реализуйте circuit breaker + bulkhead в одном сервисе, симулируйте падение зависимости.
- Degradation:
- Напишите документ «если сервис X падает — какие фичи отключаем».
- Migration plan:
- Опишите шаги выделения модуля в сервис: data ownership, интерфейсы, тесты.
- Fitness function:
- Добавьте тест/линтер, предотвращающий прямой импорт одного модуля в другой.
Безопасность: архитектурные изменения без ADR и approval — табу. Проверяйте impact (SLO, cost) до внедрения.
Что дальше
Вы дошли до финала. Теперь у вас есть набор паттернов, метрик, практик, чтобы масштабировать систему и не сойти с ума. Дальше — только практика и постмортемы.
🎉 Поздравляем с завершением курса!
Поделитесь опытом и получите промокод на бесплатный доступ к любому premium-материалу на выбор
Бесплатный доступ к любому premium-материалу на выбор
Ваш опыт поможет другим студентам
Промокод придет на email в течение 24 часов