Go Academy · Ders

Geri Çekilme ve Yeniden Deneme

Geri çekilmeli yeniden deneme yapın

4. ders / 413 adım

Geri Çekilme ve Yeniden Deneme, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

Neden yeniden deneme yapılır

Geçici hatalar, zaman aşımı, kopan bağlantılar ve kısa süreli 503 yanıtları çoğu zaman ikinci denemede başarılı olur. Yeniden deneme, çağıranı uğraştırmadan güvenilmez bir işlemi güvenilir hâle getirir.

Saf yeniden deneme tehlikelidir

Sıkı bir döngüde hemen yeniden denemek zorlanan bir hizmeti aşırı yükler ve yeniden deneme fırtınasına yol açabilir. Denemeler arasında gecikmelere ihtiyacımız vardır; bu gecikmeler de giderek artmalıdır.

Üstel bekleme

Üstel bekleme, her hatadan sonra bekleme süresini iki katına çıkarır: 100 ms, 200 ms, 400 ms, 800 ms. Bu, alt hizmete toparlanması için zaman tanır.

delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
    // try, on failure:
    time.Sleep(delay)
    delay *= 2
}

Rastgelelik ekleme

Birçok istemci aynı adımlarla beklerse aynı anda yeniden dener ve büyük bir istemci akını oluşur. Rastgelelik, her gecikmeyi biraz değiştirerek yeniden denemelerin zamana yayılmasını sağlar.

jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)

Gecikmeyi sınırlama

Üstel büyüme hızla çok büyük değerlere ulaşır. Denemeler arasında dakikalarca beklememek için gecikmeyi bir üst sınırla sınırlayın.

if delay > 2*time.Second {
    delay = 2 * time.Second
}

Deneme sayısını sınırlama

Deneme sayısını her zaman sınırlayın. Bu sınıra ulaşıldıktan sonra sonsuza kadar yeniden denemek yerine son hatayı döndürün; böylece çağıran ne yapacağına karar verebilir.

Yalnızca güvenle tekrarlanabilen işleri yeniden deneyin

Yeniden denemek yalnızca işlem iki kez çalıştırıldığında zarar vermiyorsa güvenlidir. Bir GET özdeş etkilidir; karttan ücret çeken, özdeş etkili olmayan bir POST körü körüne yeniden denenmemelidir. Gerektiğinde tekrarlanabilirlik anahtarları kullanın.

Eksiksiz beklemeli yeniden deneme

Bu program, iki kez hata veren ve ardından başarılı olan bir işlevi yeniden dener; her seferinde gecikmeyi iki katına çıkarır. Yalnızca standart kitaplığı kullanır.

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)
}

Bağlama saygı gösterme

Yeniden deneme döngüsüne bir context geçirin ve uyku sırasında ctx.Done() üzerinden seçim yapın. Böylece iptal edilen veya zaman aşımına uğrayan bir çağıran yeniden denemeyi hemen durdurabilir.

select {
case <-ctx.Done():
    return ctx.Err()
case <-time.After(delay):
}

Hataları ayırt etme

Her hata yeniden denenebilir değildir. 400 Hatalı İstek yanıtı sürekli başarısız olur. Hatayı veya durum kodunu inceleyin ve yalnızca zaman aşımı, 429 ve 5xx gibi geçici hata sınıflarında yeniden deneyin.

Devre kesiciler

Hatalar sürdüğünde devre kesici, her çağrıyı yeniden denemek yerine bir soğuma süresi boyunca istek gönderilmesini durdurur. Açıkça çalışmayan bir bağımlılığı koruyarak beklemeli yeniden denemeyi tamamlar.

Hızlı Kontrol

Beklemeli yeniden deneme bilginizi sınayın.

Özet

Beklemeli yeniden denemeyi öğrendiniz:

  • Üstel bekleme, her hatada gecikmeyi iki katına çıkarır
  • Rastgelelik, eş zamanlı yeniden deneme fırtınalarını önler
  • Gecikmeyi sınırlayın ve deneme sayısını belirli bir sınırda tutun
  • Yalnızca özdeş etkili veya yeniden denenebilir hataları yeniden deneyin
  • İptal işlemlerinde bağlama saygı gösterin
Başlamak ücretsiz

Yapay zeka eğitmeniyle Go öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Geri Çekilme ve Yeniden Deneme” dersi ücretsiz mi?

Evet — “Geri Çekilme ve Yeniden Deneme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Geri Çekilme ve Yeniden Deneme” dersinde ne öğreneceğim?

Geri çekilmeli yeniden deneme yapın Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Geri Çekilme ve Yeniden Deneme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Belirteç Kovası Kavramı
  2. golang.org/x/time/rate
  3. Goroutine'leri Kısıtlama
  4. Geri Çekilme ve Yeniden Deneme
← Go Academy Sayfasına Dön