GH GambleHub

Liveness/Readiness проби

2) Принципи дизайну

1. Розділяйте семантики.

Readiness: зовнішня здатність обслужити запити (враховує критичні залежності).
Liveness: детект «невиліковного» стану процесу.
2. Fail-fast, але не «false-fast». Налаштуйте таймаути/поріг'failureThreshold'так, щоб короткі сплески не приводили до зайвих рестартів.
3. Ніяких важких операцій в пробах. Перевірка повинна бути швидкою (≤100 -200 мс) і без побічних ефектів.
4. Граціозна деградація. При частковій недоступності залежностей - Readiness = OK, якщо є безпечний фоллбек (кеш/огрубіння).
5. Deterministic I/O. Статуси залежать тільки від поточного стану, а не від «випадкових» зовнішніх тестів.

3) Семантика HEALTH-ендпоінтів

3. 1 HTTP-підхід (рекомендується)

'GET/healthz/liveness'→ 200 якщо процес «живий» (event-loop крутиться, GC не застряг, watchdog «серце» б'ється).
'GET/healthz/readiness'→ 200 якщо екземпляр готовий до трафіку критичного класу. Перевірки: пул з'єднань, локальні кеші, доступність ядра бізнес-логіки.
'GET/healthz/startup'→ 200 після ініціалізації (міграції/прогрів кешу/завантаження моделей).

Правила:
  • Не можна в liveness ходити в зовнішні БД/API - це призведе до «самогубств» під час інцидентів залежностей.
  • У readiness можна перевіряти критичні залежності, але з таймаутами і деградацією: якщо є валідний фолбек - не валити.

3. 2 gRPC Health Checking

Використовуйте стандарт'grpc. health. v1. Health/Check'з service-scoped станами ('SERVING','NOT _ SERVING'). Для Kubernetes - grpc-проби (або http-проксі).

3. 3 Внутрішні тригери

Watchdog «м'якої» зупинки: при SIGTERM виставляти Readiness = FAIL → вичікувати'terminationGracePeriodSeconds'→ завершуватися, відпрацьовуючи черги.

4) Таймінги і пороги (tuning)

Ключові поля Kubernetes-проб:
  • `initialDelaySeconds`, `periodSeconds`, `timeoutSeconds`, `successThreshold`, `failureThreshold`.
Рекомендації по стартових профілях: Web/API з швидким стартом:
  • readiness: `period=5s, timeout=0. 2–0. 5s, failure=2`
  • liveness: `period=10s, timeout=0. 2–0. 5s, failure=3`
Важкий старт (JIT/моделі/прогрів):
  • startup: 'period = 5s, failure = 60'( до ~ 5 хв)
  • readiness/liveness активуються після успіху startup
Batch/consumer:
  • readiness відображає готовність до обробки (підключення до брокера, чи є DLQ-деградація),
  • liveness - внутрішній heartbeat loop.

Бекоф на відмовах: у додатку використовуйте експоненційний backoff на перепідключення до залежностей, інакше readiness буде «пиляти».

5) Конфігурації (фрагменти)

5. 1 Kubernetes, HTTP-проби

yaml livenessProbe:
httpGet: { path: /healthz/liveness, port: 8080 }
periodSeconds: 10 timeoutSeconds: 1 failureThreshold: 3

readinessProbe:
httpGet: { path: /healthz/readiness, port: 8080 }
periodSeconds: 5 timeoutSeconds: 1 failureThreshold: 2

startupProbe:
httpGet: { path: /healthz/startup, port: 8080 }
periodSeconds: 5 failureThreshold: 60

5. 2 Kubernetes, gRPC-проба

yaml readinessProbe:
grpc:
port: 9090 service: my. app. Service periodSeconds: 5 timeoutSeconds: 1

5. 3 Graceful shutdown

yaml terminationGracePeriodSeconds: 30 lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","curl -s localhost:8080/healthz/drain && sleep 5"]

'/healthz/drain'всередині сервісу переводить Readiness = FAIL (stop-accepting), дає часу завершити активні запити.

6) Залежності та деградація

Критичні (без них не можна обслужити): БД авторизації для '/login', платіжний шлюз для '/pay'. Можна перевіряти в readiness з таймаутом ≤80% від'timeoutSeconds'проби.
Некритичні: аналітика, email, кеш-шар при наявності довантажу. Не включайте їх в readiness; Використовуйте фолбек.
Feature-flags: при частковій деградації відключайте залежні фічі, зберігаючи Readiness = OK.

7) Черги та фонові обробники

Consumers/Workers:
  • Readiness = OK, якщо підписка/конект до брокера встановлений і є ресурс для обробки.
  • При переповненні DLQ/лаге → Readiness може залишатися OK (якщо приймаємо і складаємо), але SLI «свіжість/лаг» загоряється - алерт за даними.
  • Liveness: контролюйте poll-цикл/heartbeat, дідлок-детектор.

Ідемпотентність: прискорює відновлення після рестартів liveness.

8) Sidecar/mesh/ingress

При використанні service mesh (Istio/Linkerd) probe може йти через sidecar:
  • Увімкніть'readinessGate'( K8s) для врахування статусу sidecar,
  • Переконайтеся, що проби не потрапляють в mTLS-бар'єри (або додайте винятки).
  • Ingress/Envoy/Nginx: проксируйте '/healthz/' локально, не «виводьте назовні» внутрішні деталі.

9) Безпека і приватність

Health-ендпоінти не повинні розкривати конфіги, версії бібліотек, рядки помилок - тільки «OK/FAIL» + мінімальний код причини.
Доступ ззовні обмежте (NetworkPolicy/ACL). Для публічних - давайте тільки liveness-пінг без деталей.
Логи health-перевірок - на рівні DEBUG, з тротлінгом.

10) Спостережуваність і SLO

Експортуйте метрики: 'health _ readiness {status}','health _ liveness {status}', час обробки проби.
Зв'язуйте Readiness-флапи з SLO доступності (випадання з ендпоінтів → 5xx/connection reset).

Алерти:
  • «Часті рестарти по liveness> N/год» - симптом дедлоків/витоків.
  • «Флап Readiness> X/15 хв» - симптом залежності/мережевих проблем.
  • Кореляція з деплоєм ('service. version`).

11) Тестування

Unit/Contract: ендпоінти '/healthz/' повертають коректні статуси при виключенні кожної залежності.
Chaos: відключення БД/кешу/брокера: Readiness повинен падати або включати фоллбек строго за моделлю. Liveness - не тригериться, якщо процес «живий».
Load/Soak: під навантаженням health-ендпоінти повинні залишатися швидкими (не прокидати контеншн).
Canary: перевіряйте стабільність Readiness перед збільшенням трафіку.

12) Часті помилки і як їх уникнути

Liveness перевіряє БД/зовнішні API. Підсумок - нескінченні рестарти при інцидентах. Рішення: обмежити liveness «життям процесу».
Важкі перевірки в пробах. Веде до помилкових відмов. Рішення: легкі перевірки + окремі background-health монітори.
Немає Startup Probe. Повільні старти «вбиваються» liveness. Рішення: додати startup з широким вікном.
Відсутність graceful shutdown. Рідкісні 5xx при деплої. Рішення: preStop + зняття з балансування.
Флап-шторми. Занадто агресивні пороги. Рішення: підняти'failureThreshold', збільшити'timeoutSeconds', додати backoff.
Однакові ендпоінти для всього. Змішування семантик. Рішення: окремі'liveness/readiness/startup'.

13) Міні-патерни реалізації

Простий HTTP-хендлер (псевдокод):
python
@app. get("/healthz/liveness")
def liveness():
return 200

@app. get("/healthz/readiness")
def readiness():
ok_core = core_is_ready () # local pools/caches/initialization ok_db = db. ping (timeout = 50 _ ms) # only if the DB is critical return 200 if (ok_core and ok_db) else 503

@app. get("/healthz/startup")
def startup():
return 200 if INIT_DONE else 503

@app. post("/healthz/drain")
def drain():
set_readiness(False); return 200
gRPC health (ідея):
go
// use google. golang. org/grpc/health/grpc_health_v1 healthServer. SetServingStatus("my. app. Service", SERVING) // or NOT_SERVING
ReadinessGate (істина з mesh):
yaml spec:
readinessGates:
- conditionType: "proxy. istio. io/ready"

14) Чек-листи

Перед продом

  • Розділені ендпоінти liveness/readiness/startup, описана їх семантика.
  • Liveness не чіпає зовнішні залежності; Readiness перевіряє тільки критичні з таймаутами і фоллбеком.
  • Налаштовані'initialDelay/period/timeout/failureThreshold'під профіль сервісу.
  • Включений graceful shutdown: 'preStop'+ зняття з балансування.
  • Метрики/логи здоров'я підключені; алерти на рестарти/флап.
  • Тести відмов залежностей і повільних стартів пройдені.

Експлуатація

  • Щотижневий звіт по рестартам і флапам readiness.
  • Тюнінг порогів після інцидентів; зв'язок з релізами.
  • Регулярні chaos-тести вимикання залежностей.
  • Актуальність семантик при зміні критичності залежностей.

15) FAQ

В: Чи можна однією пробою закрити все?
ПРО: Небажано. Розділяйте'startup','readiness','liveness'- це знижує помилкові спрацьовування і прискорює RCA.

В: Чи перевіряти кеш в readiness?
ПРО: Якщо без кеша є коректний (хоч і повільний) режим - не валіть readiness, просто увімкніть деградацію.

В: Що робити при частих рестартах по liveness?
ПРО: Спочатку виключіть дідлок/витік; потім послабте пороги і додайте watchdog в додатку.

В: Як врахувати багатоарендність?
ПРО: Readiness повинен відображати здатність обслужити будь оренда-трафік. Для приватних проблем конкретного орендаря - не змінюйте readiness, а сигналізуйте окремими SLI/алертами.

Пов'язані матеріали:
  • "Спостережуваність: логи, метрики, трасування"
  • «Розподілені трасування»
  • «SLO/SLA і метрики»
  • «Гарантії доставки вебхуків»
  • «Шифрування In Transit»
  • «Менеджмент секретів»
Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Telegram
@Gamble_GC
Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.