Retry Logic
Qayta urinish mantig'i
"Retry with Exponential Backoff" darsida tarmoq so'rovlari uchun qayta urinishni ko'rgan edingiz — endi shu g'oyani Task Queue'ning O'ZIGA qo'llaymiz: agar worker vazifani bajarishda XATOGA duch kelsa (masalan vaqtinchalik muammo tufayli), uni DARHOL "muvaffaqiyatsiz" deb belgilash o'rniga, bir necha marta QAYTA urinib ko'rish kerak.
package main
import (
"errors"
"fmt"
)
type Task struct {
ID string
Attempts int
MaxRetries int
}
// executeWithRetry — vazifani bajaradi, xato bo'lsa MaxRetries martagacha qayta urinadi
func executeWithRetry(task *Task, fn func() error) error {
var err error
for task.Attempts < task.MaxRetries {
task.Attempts++
err = fn()
if err == nil {
return nil
}
}
return fmt.Errorf("vazifa %s: %d urinishdan keyin muvaffaqiyatsiz: %w", task.ID, task.Attempts, err)
}
func main() {
task := &Task{ID: "task-1", MaxRetries: 3}
callCount := 0
err := executeWithRetry(task, func() error {
callCount++
if callCount < 3 {
return errors.New("vaqtinchalik xato")
}
return nil
})
fmt.Println(err, task.Attempts)
}task.Attempts — har bir urinishda OSHADI, va Task struct'ining O'ZIDA saqlanadi ("Task Definition" darsida bu maydonni shu maqsadda qo'shgan edik). Bu — nafaqat qayta urinish mantig'i uchun, balki KEYINCHALIK (masalan HTTP API orqali) "bu vazifa nechta marta urinib ko'rilgan edi?" degan savolga javob berish uchun ham foydali.
Bu misolda callCount < 3 — vazifa FAQAT uchinchi urinishda muvaffaqiyatli bo'ladi, va MaxRetries: 3 bo'lgani uchun aynan shu ichida ULGURADI. Agar vazifa 3 martadan KO'PROQ urinish talab qilsa, executeWithRetry OXIRGI xatoni o'rab (%w bilan) qaytaradi — bu "barcha urinishlar tugadi, vazifa haqiqatan muvaffaqiyatsiz" deganidir.
>_ Exercise
Doim muvaffaqiyatsiz bo'ladigan vazifa bilan retry chegarasini sinang.
- •MaxRetries=4 bilan Task yarating
- •executeWithRetry'ni har doim errors.New("doimiy xato") qaytaradigan funksiya bilan chaqiring
- •qaytgan xato va task.Attempts qiymatini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Retry logic — Task'ning o'z Attempts maydonida urinishlar sonini kuzatib, belgilangan chegaraga yetguncha vazifani qayta bajarishga urinadi, va faqat chegaradan oshgandan keyin uni haqiqatan muvaffaqiyatsiz deb hisoblaydi.
NEXT UP
HTTP API for Task Queue
$ go run main.go
Kodingizni ishga tushiring