Temporisation progressive et nouvelle tentative
Réessayer avec une temporisation progressive
Temporisation progressive et nouvelle tentative est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.
Pourquoi réessayer
Les défaillances transitoires, les délais d'attente, les connexions interrompues et les brèves erreurs 503 réussissent souvent dès la deuxième tentative. Réessayer transforme une opération instable en opération fiable sans importuner l'appelant.
Les nouvelles tentatives naïves sont dangereuses
Réessayer immédiatement dans une boucle serrée accable un service en difficulté et peut provoquer une tempête de nouvelles tentatives. Nous avons besoin de délais entre les tentatives, et ces délais doivent augmenter.
Temporisation exponentielle
La temporisation exponentielle double le délai d'attente après chaque échec : 100ms, 200ms, 400ms, 800ms. Le service en aval dispose ainsi du temps nécessaire pour récupérer.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}Ajouter de la gigue
Si de nombreux clients augmentent leur délai d'attente en même temps, ils réessaient au même instant, ce qui crée un effet de troupeau. La gigue randomise légèrement chaque délai afin d'espacer les nouvelles tentatives dans le temps.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)Plafonner le délai
La croissance exponentielle devient rapidement considérable. Plafonnez le délai à une valeur maximale afin de ne pas attendre plusieurs minutes entre les tentatives.
if delay > 2*time.Second {
delay = 2 * time.Second
}Limiter le nombre de tentatives
Limitez toujours le nombre de tentatives. Une fois cette limite atteinte, renvoyez la dernière erreur afin que l'appelant puisse décider quoi faire plutôt que de réessayer indéfiniment.
Réessayer uniquement les opérations idempotentes
Réessayer est sûr uniquement lorsque l'opération peut être exécutée deux fois sans conséquence néfaste. Un GET est idempotent ; un POST non idempotent qui débite une carte ne doit pas être réessayé aveuglément. Utilisez des clés d'idempotence lorsque cela est nécessaire.
Une nouvelle tentative avec temporisation complète
Ce programme réessaie une fonction qui échoue deux fois avant de réussir, en doublant le délai à chaque fois. Il utilise uniquement la bibliothèque standard.
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)
}Respecter le contexte
Transmettez un context à la boucle de nouvelles tentatives et utilisez une sélection sur ctx.Done() pendant l'attente. Ainsi, un appelant qui annule l'opération ou dont le délai d'attente est dépassé peut interrompre immédiatement les nouvelles tentatives.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}Distinguer les erreurs
Toutes les erreurs ne peuvent pas être réessayées. Une erreur 400 Requête incorrecte échouera indéfiniment. Examinez l'erreur ou le code d'état et ne réessayez que pour des catégories transitoires comme les délais d'attente, 429 et 5xx.
Disjoncteurs
Lorsque les échecs persistent, un disjoncteur cesse d'envoyer des requêtes pendant une période de refroidissement au lieu de réessayer chaque appel. Il complète la temporisation en protégeant une dépendance manifestement hors service.
Vérification rapide
Testez vos connaissances sur la temporisation.
Récapitulatif
Vous avez appris la temporisation et les nouvelles tentatives :
- La temporisation exponentielle double le délai après chaque échec
- La gigue empêche les tempêtes de nouvelles tentatives synchronisées
- Plafonnez le délai et limitez le nombre de tentatives
- Ne réessayez que les erreurs idempotentes ou réessayables
- Respectez le contexte pour permettre l'annulation
Apprends Go avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Temporisation progressive et nouvelle tentative » est-elle gratuite ?
Oui — le texte complet de « Temporisation progressive et nouvelle tentative » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Temporisation progressive et nouvelle tentative » ?
Réessayer avec une temporisation progressive Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Go Academy ?
Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Temporisation progressive et nouvelle tentative » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?
Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Concept du seau de jetons
- golang.org/x/time/rate
- Limitation des goroutines
- Temporisation progressive et nouvelle tentative