GoDasturchi
Retry Logic

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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