Case Study: The Request That Times Out
Amaliy holat: vaqti tugagan so'rov
Restoranda bitta ofitsiantni tasavvur qiling: u bitta mijozning buyurtmasini oshxonaga olib borib, OSHPAZ TAYYORLAB BO'LGUNCHA u yerda TURIB kutadi — boshqa hech qaysi stolga borolmaydi. Agar oshpaz shu taomni tayyorlash odatiy 10 daqiqa o'rniga 40 daqiqaga cho'zib yuborsa, o'sha ofitsiant BUTUN 40 daqiqa davomida boshqa hech kimga xizmat qila olmaydi — navbatdagi mijozlar "vaqt tugadi" deb ketib qoladi.
Stsenariy: sizning HTTP API'ingiz ba'zan (har doim emas) "vaqt tugadi" (timeout) xatosi bilan javob bermay qolmoqda. Xato faqat KUCHLI YUKLAMA paytida ko'proq sodir bo'ladi.
func getUserProfile(w http.ResponseWriter, r *http.Request) {
userID := r.URL.Query().Get("id")
// Tashqi tarjima (billing) xizmatidan foydalanuvchi balansini so'raymiz
resp, err := http.Get("https://billing.internal/balance?user=" + userID)
if err != nil {
http.Error(w, "billing service error", http.StatusInternalServerError)
return
}
defer resp.Body.Close()
// ...javobni o'qib, foydalanuvchi profiliga qo'shib qaytaramiz...
}Reading a Stack Trace darsidagi kabi bu yerda ham aniq "panic" yo'q — bu HTTP darajasidagi timeout, ya'ni mijoz javobni kutishdan charchab, so'rovni bekor qiladi. Gipoteza: "agar timeout faqat yuklama kuchli paytida ko'proq sodir bo'lsa, demak biror joyda RESURS (masalan, ulanish yoki vaqt) YETISHMAY qolyapti".
- •
http.Get("https://billing.internal/...")chaqiruvida HECH QANDAY timeout belgilanmagan — agarbillingxizmati sekinlashsa, bu so'rov CHEKSIZ kutadi - •Har bir so'rov o'z navbatida shu "cheksiz kutuvchi" chaqiruvni ushlab turadi, va ko'p so'rov bir vaqtda kelganda, ular BARCHASI navbatda qoladi — xuddi restorandagi ofitsiant kabi
- •Isolating Variables darsidagi kabi: faqat
billingxizmatining javob berish vaqtini sun'iy sekinlashtirib ko'rsangiz (boshqa hamma narsani o'zgarmas qoldirib), muammo darhol takrorlanadi
Sabab topildi: HTTP & Networking kursida ko'rgan context.WithTimeout ishlatilmagan — tashqi xizmatga so'rov CHEKSIZ vaqt kutishi mumkin, va bu vaqt ichida go'yo "ushlab turilgan" resurs (goroutine, ulanish) boshqa so'rovlarga xizmat qila olmaydi. Yechim — har bir tashqi chaqiruvga ANIQ timeout (masalan, 3 soniya) belgilash: http.NewRequestWithContext bilan context.WithTimeout qo'llash, shunda sekin xizmat BUTUN tizimni to'xtatib qo'ymaydi.
Umumiy saboq: "faqat kuchli yuklamada" sodir bo'ladigan xatolar deyarli har doim CHEKLANGAN resurs (ulanishlar soni, goroutine soni, xotira) haqida gapiradi — past yuklamada resurs yetarli, yuqori yuklamada esa yetishmay qoladi. Bunday xatolarni qidirishda birinchi savol: "qaysi tashqi chaqiruvda timeout YO'Q?"
Key Takeaway
Key Takeaway:
Faqat kuchli yuklamada paydo bo'ladigan timeout xatolari — odatda tashqi chaqiruvda cheklov (timeout) yo'qligini ko'rsatadi: bitta sekin javob, uni kutayotgan resursni cheksiz band qilib qo'yadi. Har bir tashqi so'rovga aniq timeout belgilash bu turdagi xatoni oldini oladi.
NEXT UP
Case Study: The Goroutine That Never Finishes