Backoff dan Percobaan Ulang
Coba lagi dengan backoff
Backoff dan 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.
Mengapa Melakukan Percobaan Ulang
Kegagalan sementara, timeout, koneksi terputus, dan 503 singkat sering kali berhasil pada percobaan kedua. Percobaan ulang mengubah operasi yang tidak stabil menjadi operasi yang andal tanpa merepotkan pemanggil.
Percobaan Ulang Naif Berbahaya
Melakukan percobaan ulang segera dalam perulangan ketat akan membebani layanan yang sedang bermasalah dan dapat menyebabkan badai percobaan ulang. Kita memerlukan jeda antarpercobaan, dan jeda tersebut harus semakin panjang.
Penundaan Eksponensial
Penundaan eksponensial menggandakan waktu tunggu setelah setiap kegagalan: 100ms, 200ms, 400ms, 800ms. Ini memberi layanan tujuan waktu untuk pulih.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}Menambahkan Pengacakan
Jika banyak klien melakukan penundaan secara serentak, mereka akan mencoba lagi pada saat yang sama dan menimbulkan serbuan serentak. Pengacakan sedikit mengubah setiap jeda secara acak agar percobaan ulang tersebar dari waktu ke waktu.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)Membatasi Jeda
Pertumbuhan eksponensial cepat menjadi sangat besar. Batasi jeda pada nilai maksimum agar Anda tidak menunggu selama beberapa menit di antara percobaan.
if delay > 2*time.Second {
delay = 2 * time.Second
}Membatasi Jumlah Percobaan
Selalu batasi jumlah percobaan. Setelah batas tercapai, kembalikan error terakhir agar pemanggil dapat memutuskan tindakan berikutnya, alih-alih mencoba ulang tanpa henti.
Coba Ulang Hanya Pekerjaan Idempoten
Percobaan ulang hanya aman jika operasi dapat dijalankan dua kali tanpa menimbulkan dampak buruk. GET bersifat idempoten; POST yang tidak idempoten dan menagih kartu tidak boleh dicoba ulang secara membabi buta. Gunakan kunci idempotensi jika diperlukan.
Percobaan Ulang dengan Penundaan Lengkap
Program ini mencoba ulang sebuah fungsi yang gagal dua kali lalu berhasil, dengan menggandakan jeda setiap kali. Program ini hanya menggunakan pustaka standar.
package main
import (
"errors"
"fmt"
"time"
)
func flaky(attempt int) error {
if attempt < 2 {
return errors.New("temporary failure")
}
return nil
}
func main() {
delay := 50 * time.Millisecond
var err error
for attempt := 0; attempt < 5; attempt++ {
err = flaky(attempt)
if err == nil {
fmt.Println("succeeded on attempt", attempt)
return
}
fmt.Printf("attempt %d failed, waiting %v\n", attempt, delay)
time.Sleep(delay)
delay *= 2
}
fmt.Println("gave up:", err)
}Menghormati context
Teruskan context ke dalam perulangan percobaan ulang dan gunakan select pada ctx.Done() saat tidur. Dengan begitu, pemanggil yang dibatalkan atau mengalami timeout dapat segera menghentikan percobaan ulang.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}Membedakan Error
Tidak semua error dapat dicoba ulang. 400 Bad Request akan selalu gagal. Periksa error atau kode status, lalu lakukan percobaan ulang hanya pada kelas sementara seperti timeout, 429, dan 5xx.
Pemutus Sirkuit
Saat kegagalan terus berlanjut, pemutus sirkuit berhenti mengirim permintaan selama masa pendinginan, alih-alih mencoba ulang setiap pemanggilan. Fitur ini melengkapi penundaan dengan melindungi dependensi yang jelas-jelas sedang tidak berfungsi.
Pemeriksaan Singkat
Uji pemahaman Anda tentang penundaan.
Ringkasan
Anda telah mempelajari penundaan dan percobaan ulang:
- Penundaan eksponensial menggandakan jeda pada setiap kegagalan
- Pengacakan mencegah badai percobaan ulang yang tersinkronisasi
- Batasi jeda dan jumlah percobaan
- Lakukan percobaan ulang hanya pada operasi idempoten atau error yang dapat dicoba ulang
- Hormati context untuk pembatalan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Backoff dan Percobaan Ulang” gratis?
Ya — teks lengkap “Backoff dan 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 “Backoff dan Percobaan Ulang”?
Coba lagi dengan backoff 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 “Backoff dan 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
- Konsep Token Bucket
- golang.org/x/time/rate
- Throttling Goroutine
- Backoff dan Percobaan Ulang