Мікросервіси
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 (Тестування) → Q26 (Оркестрація)
🎓 Шпаргалка: що знати для кожного рівня
🟢 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
- 🎯 Шпаргалка для співбесіди — ключові тези, часті питання, червоні прапорці, пов’язані теми