Health & Readiness Endpoints
Sog'lik va tayyorlik endpoint'lari
Shifoxonada ikkita boshqa-boshqa savol beriladi: "bemor tirikmi?" (juda asosiy tekshiruv) va "bemor operatsiyaga tayyor holatdami?" (batafsilroq, ko'proq shartni tekshiradigan savol). Kubernetes ham konteyneringizga aynan shu ikki turdagi savolni beradi — liveness ("tirikmisan?") va readiness ("tayyor holatdamisan?") endpoint'lari orqali.
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
)
type HealthStatus struct {
Status string `json:"status"`
}
// LIVENESS: "dastur umuman ishlayaptimi?" — juda oddiy, tez javob
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(HealthStatus{Status: "ok"})
}
var dbConnected = false
// READINESS: "haqiqiy so'rovlarni QABUL QILISHGA tayyormisan?" — bog'liqliklarni tekshiradi
func readyHandler(w http.ResponseWriter, r *http.Request) {
if !dbConnected {
w.WriteHeader(http.StatusServiceUnavailable)
json.NewEncoder(w).Encode(HealthStatus{Status: "not ready"})
return
}
json.NewEncoder(w).Encode(HealthStatus{Status: "ready"})
}
func main() {
req := httptest.NewRequest("GET", "/ready", nil)
rec := httptest.NewRecorder()
readyHandler(rec, req)
fmt.Println(rec.Code)
}Farq nozik, lekin muhim: /health (liveness) — "dasturning o'zi ishlab turibdimi, yoki qotib qolganmi?" degan savolga javob beradi, deyarli hech qanday tekshiruv qilmasdan. Agar bu javob bermasa, Kubernetes konteynerni o'ldirib, qayta ishga tushiradi. /ready (readiness) esa "men HOZIR haqiqiy so'rovlarni qabul qilishga tayyormanmi?" (masalan, bazaga ulanish o'rnatilganmi?) degan savolga javob beradi. Agar bu javob bermasa, Kubernetes konteynerni o'ldirmaydi, faqat unga vaqtincha trafik yubormay turadi — chunki u ehtimol tez orada tayyor bo'lib qoladi.
Bu farqni tushunmaslik keng tarqalgan xato: agar /healthni bazaga ulanishni tekshiradigan qilib yozsangiz, baza bir zumga qulasa, Kubernetes butun dasturingizni keraksiz ravishda qayta-qayta o'ldirib turadi — holbuki muammo dastur emas, faqat bazaning vaqtinchalik yo'qligi edi.
>_ Exercise
Ikkita bog'liqlikni (baza va kesh) tekshiradigan readiness handler yozing.
- •readyHandler'ni yozing: dbConnected VA cacheConnected ikkalasi ham true bo'lsagina 200 va "ready" qaytarsin
- •biror biri false bo'lsa 503 va "not ready" qaytarsin
- •dbConnected=true, cacheConnected=false holatida chaqirib, status kodni chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Liveness ("tirikmisan?") va readiness ("tayyormisan?") — ikki xil savol: birinchisi javobsiz qolsa konteyner qayta ishga tushadi, ikkinchisi javobsiz qolsa faqat trafik vaqtincha to'xtatiladi.
NEXT UP
Structured Logging for Cloud
$ go run main.go
Kodingizni ishga tushiring