Go Academy · Pelajaran

Penanganan Error dan Logika Percobaan Ulang

Memeriksa kode status dan mengimplementasikan percobaan ulang

Pelajaran 4 dari 413 langkah

Penanganan Error dan Logika Percobaan Ulang adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Kesalahan HTTP bukan kesalahan Go

Status HTTP 404 atau 500 bukan kesalahan Go—http.Client.Do mengembalikan kesalahan nil untuk setiap respons HTTP yang valid. Periksa resp.StatusCode secara eksplisit.

Membungkus kesalahan

Bungkus kesalahan dengan konteks menggunakan fmt.Errorf("operation: %w", err) agar pemanggil dapat memeriksa penyebabnya dengan errors.Is / errors.As.

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

Kesalahan yang dapat dan tidak dapat dicoba ulang

Coba ulang: batas waktu jaringan, 429 Terlalu Banyak Permintaan, 503 Layanan Tidak Tersedia. Jangan coba ulang: 400 Permintaan Tidak Valid, 401 Tidak Terautorisasi, 404 Tidak Ditemukan—percobaan ulang tidak akan membantu.

Jeda eksponensial

Tunggu lebih lama di antara setiap percobaan ulang untuk mengurangi beban pada server yang sedang bermasalah. Implementasi sederhana:

for i := 0; i < maxRetries; i++ {
    resp, err := client.Do(req)
    if err == nil && resp.StatusCode < 500 { break }
    time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}

Variasi acak

Tambahkan variasi acak pada jeda untuk mencegah beberapa klien mencoba ulang secara bersamaan (serbuan bersamaan).

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

Header Retry-After

Respons 429 sering kali menyertakan header Retry-After. Uraikan dan patuhi header tersebut, bukan menggunakan jeda tetap.

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

Percobaan ulang berbasis konteks

Periksa konteks sebelum setiap percobaan ulang untuk menghentikan percobaan jika permintaan dibatalkan.

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

Tipe kesalahan khusus

Tentukan kesalahan HTTP bertipe untuk membawa kode status dan isi respons, sehingga pemanggil dapat mengambil keputusan percobaan ulang yang lebih terperinci.

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

Pilihan pustaka

Pertimbangkan hashicorp/go-retryablehttp atau cenkalti/backoff untuk logika percobaan ulang produksi dengan kebijakan jeda yang dapat dikonfigurasi, jumlah percobaan ulang maksimum, dan dukungan konteks.

Kunci idempotensi

Untuk permintaan POST yang dicoba ulang, sertakan header kunci idempotensi (UUID) agar server menghapus duplikasi percobaan ulang dan mengembalikan hasil yang sama tanpa membuat sumber daya duplikat.

Pemutus sirkuit

Pemutus sirkuit melacak tingkat kegagalan dan berhenti mengirim permintaan ke layanan yang gagal selama periode pendinginan. Pustaka seperti sony/gobreaker menerapkan pola ini.

Pemeriksaan Singkat

Mengapa Anda harus menambahkan variasi acak pada jeda eksponensial?

Ringkasan: Penanganan Kesalahan dan Percobaan Ulang

Poin penting:

  • Periksa resp.StatusCode—kesalahan HTTP bukan kesalahan Go
  • Coba ulang pada 429, 503, dan batas waktu jaringan; jangan pada kesalahan klien 4xx
  • Jeda eksponensial + variasi acak mencegah serbuan bersamaan
  • Selalu periksa konteks sebelum mencoba ulang
Gratis untuk memulai

Belajar Go dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penanganan Error dan Logika Percobaan Ulang” gratis?

Ya — teks lengkap “Penanganan Error dan Logika Percobaan Ulang” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penanganan Error dan Logika Percobaan Ulang”?

Memeriksa kode status dan mengimplementasikan percobaan ulang Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Penanganan Error dan Logika Percobaan Ulang” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membuat Permintaan HTTP
  2. Mengatur Batas Waktu dan Header
  3. Menguraikan Respons JSON
  4. Penanganan Error dan Logika Percobaan Ulang
← Kembali ke Go Academy