Микросервисы
26 вопросов и ответов в разделе Микросервисы.
Вопросы этого раздела
- Что такое паттерн Saga и когда его использовать
- В чём разница между хореографией и оркестрацией в Saga
- Как реализовать распределённые транзакции в микросервисах
- Что такое компенсирующие транзакции
- Что такое паттерн Circuit Breaker
- Как работает Circuit Breaker и какие у него состояния
- Что такое Service Discovery и зачем он нужен
- В чём разница между client-side и server-side discovery
- Что такое API Gateway и какие задачи он решает
- Что такое шардирование (sharding)
- В чём разница между шардированием и партиционированием
- Как реализовать горизонтальное масштабирование микросервисов
- Что такое паттерн Database per Service
- Какие проблемы возникают при использовании общей базы данных
- Как организовать коммуникацию между микросервисами
- В чём разница между синхронной и асинхронной коммуникацией
- Как обеспечить отказоустойчивость микросервисов
- Что такое паттерн Bulkhead
- Что такое паттерн Retry и как его правильно использовать
- Что такое exponential backoff
- Как мониторить распределённую систему микросервисов
- Что такое distributed tracing
- Как реализовать аутентификацию и авторизацию в микросервисах
- Что такое паттерн Strangler Fig
- Как тестировать микросервисы
- Какие инструменты используются для оркестрации микросервисов
Навигатор по разделу
26 вопросов для подготовки к собеседованию на Middle/Senior Java Developer.
📋 Все вопросы
🗺️ Карта зависимостей тем
┌──────────────────────────────────────────┐
│ АРХИТЕКТУРА (13-14) │
│ 13. Database per Service │
│ 14. Проблемы общей БД │
└──────────────────┬───────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ ТРАНЗАКЦИИ │ │ КОММУНИКАЦИЯ │ │ МАСШТАБИРОВАНИЕ │
│ (1-4) │ │ (15-16) │ │ (10-12) │
│ 1. Saga │ │ 15. Коммуник. │ │ 10. Sharding │
│ 2. Choreo vs │ │ 16. Sync vs │ │ 11. Shard vs Part │
│ Orchest │ │ Async │ │ 12. Horiz. scaling │
│ 3. Распред. │ │ │ │ │
│ транзак. │ │ │ │ │
│ 4. Компенсир. │ │ │ │ │
└───────┬───────┘ └───────┬───────┘ └────────┬───────────┘
│ │ │
└────────────────────────┼────────────────────────┘
▼
┌──────────────────────────────────────────┐
│ ОБНАРУЖЕНИЕ И МАРШРУТИЗАЦИЯ (7-9) │
│ 7. Service Discovery │
│ 8. Client vs Server │
│ 9. API Gateway │
└──────────────────────────────────────────┘
│
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ ОТКАЗОУСТОЙЧ. │ │ МОНИТОРИНГ │ │ PRACTICES │
│ (5-6, 17-20) │ │ (21-22) │ │ (23-26) │
│ 5. Circuit │ │ 21. Мониторинг │ │ 23. Auth/Authz │
│ Breaker │ │ 22. Tracing │ │ 24. Strangler Fig │
│ 6. Состояния │ │ │ │ 25. Тестирование │
│ 17. Отказоуст. │ │ │ │ 26. Оркестрация │
│ 18. Bulkhead │ │ │ │ │
│ 19. Retry │ │ │ │ │
│ 20. Backoff │ │ │ │ │
└───────────────┘ └───────────────┘ └────────────────────┘
🎯 Рекомендуемый порядок изучения
🟢 Уровень Junior (недели 1-2)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Архитектура | Q13, Q14 | Database per Service, проблемы общей БД |
| 2 | Коммуникация | Q15, Q16 | Sync vs Async, когда что |
| 3 | Service Discovery | Q7, Q8 | Зачем, client vs server |
| 4 | API Gateway | Q9 | Зачем нужен, когда не нужен |
🟡 Уровень Middle (недели 3-4)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Circuit Breaker | Q5, Q6 | Состояния, параметры Resilience4j |
| 2 | Retry + Backoff | Q19, Q20 | Exponential backoff, jitter, thundering herd |
| 3 | Bulkhead | Q18 | Thread Pool vs Semaphore |
| 4 | Масштабирование | Q10, Q11, Q12 | Sharding, партиционирование, HPA |
| 5 | Monitoring | Q21, Q22 | Golden signals, distributed tracing |
🔴 Уровень Senior (недели 5-6)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Saga | Q1, Q2 | Choreography vs orchestration, compensations |
| 2 | Distributed transactions | Q3, Q4 | Outbox, CDC, compensating transactions |
| 3 | Fault tolerance | Q17 | Комбинация паттернов, cascade failure |
| 4 | Auth/Authz | Q23 | JWT, OAuth2, token validation overhead |
| 5 | Strangler Fig | Q24 | Пошаговая миграка, dual write problem |
| 6 | Testing + Orchestration | Q25, Q26 | Contract tests, Testcontainers, K8s |
🔗 Ключевые связи между темами
Тема: Транзакции
Q1 (Saga) → Q2 (Choreography vs Orchestration) → Q3 (Распред. транзакции) → Q4 (Компенсации)
Ключевые связи:
- Q1 ↔ Q4: Saga использует компенсирующие транзакции для rollback
- Q2 ↔ Q3: Orchestration = command-driven, Choreography = event-driven
- Q3 ↔ Q13: Database per Service → нужны распределённые транзакции
Тема: Коммуникация
Q15 (Коммуникация) → Q16 (Sync vs Async)
Тема: Отказоустойчивость
Q5 (Circuit Breaker) → Q6 (Состояния) → Q17 (Отказоустойчивость)
↓
Q18 (Bulkhead) → Q19 (Retry) → Q20 (Exponential Backoff)
Ключевые связи:
- Q5 ↔ Q17: Circuit Breaker — один из 5 паттернов отказоустойчивости
- Q19 ↔ Q20: Retry использует exponential backoff + jitter для thundering herd
- Q18 ↔ Q6: Bulkhead ограничивает concurrent calls, Circuit Breaker — по error rate
Тема: Масштабирование
Q10 (Sharding) → Q11 (Shard vs Partition) → Q12 (Horizontal Scaling)
Тема: Monitoring
Q21 (Мониторинг) → Q22 (Distributed Tracing)
Тема: Practices
Q23 (Auth) → Q24 (Strangler Fig) → Q25 (Testing) → Q26 (Orchestration)
🎓 Шпаргалка: что знать для каждого уровня
🟢 Junior
- Database per Service = каждый сервис имеет свою БД (нет JOIN между сервисами)
- Sync = HTTP/gRPC (ждём ответ), Async = Kafka/RabbitMQ (fire-and-forget)
- Service Discovery = механизм нахождения IP сервисов в динамической среде
- API Gateway = единая точка входа для внешних клиентов
🟡 Middle
- Circuit Breaker: Closed → Open (при error rate > threshold) → Half-Open (probe)
- Exponential backoff + jitter предотвращает thundering herd
- Sharding = разные данные на разных серверах, Partitioning = разделение внутри одной БД
- Distributed tracing: trace ID → span ID → propagates через HTTP headers
- Contract testing (Pact) ловит breaking changes в API до production
🔴 Senior
- Saga: orchestration (центральный контроллер) vs choreography (event-driven)
- Compensating transaction ≠ rollback — это новая транзакция, делающая противоположное
- Outbox pattern: запись события в той же транзакции + CDC → Kafka
- Bulkhead: Thread Pool (полная изоляция) vs Semaphore (легче, но нет изоляции потоков)
- Strangler Fig: постепенная замена монолита, dual write problem → Outbox/CDC
- JWT overhead: 200K HMAC/RSA ops при 10K req/s × 20 сервисов
📝 Формат каждого файла
Каждый файл содержит:
- 🟢 Junior Level — базовое понимание, простые аналогии, примеры
- 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
- 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы