Oyun Kitabı
Algorithmes de nouvelle tentative pour les agents de paiement (Algorithmes DE Nouvelle Tentative Pour Les Agents DE Paiement)
Interruption exponentielle, gigue, plafond, différence de report ou de nouvelle tentative et disjoncteur : traduisez la taxonomie de la section précédente en code fonctionnel.
Moteur de paiement distribué
Partie 12 de 22
Une série d'architectures de paiement distribuées qui comblent le fossé entre la capture et l'achèvement.
Nous avons défini quatre catégories d'erreurs dans la section précédente. Cette section configure l'algorithme réel pour les trois catégories récupérables (requête après expiration du délai, débit limité, infrastructure) : combien de temps attendre, combien de fois essayer, quand s'arrêter complètement et allumer le disjoncteur.```text Attempt 1 → başarısız → bekle (backoff) → Attempt 2 → başarısız → bekle (daha uzun) → Attempt 3 → başarısız → cap'e ulaşıldı → defer / dead-letter
## Concepts à la première mention```text
📦 Exponential Backoff
Her denemede bekleme süresini katlayarak artıran strateji: base * 2^attempt.
📦 Jitter
Backoff süresine eklenen rastgele sapma; çok sayıda worker'ın aynı anda tekrar denemesini (thundering herd) önler.
📦 Cap
Bekleme süresinin ve/veya deneme sayısının üst sınırı; sonsuz retry döngüsünü engeller.
📦 Circuit Breaker
Bir bağımlılık sürekli başarısız olduğunda istekleri tamamen durduran, zamanla yeniden deneyen koruma mekanizması.
```L'interruption sans gigue entraîne une nouvelle tentative de centaines de tâches qui échouent en même temps dans la même milliseconde, ce qui met une PSP déjà stressée dans une situation encore pire.
## Formule de backoff et pourquoi une attente constante ne suffit pas
L'attente fixe d'une seconde est simple, mais elle présente deux problèmes : 1 seconde peut ne pas suffire si la PSP subit une courte rafale ; Si la PSP a déjà récupéré, 1 seconde est une lenteur inutile. L'intervalle exponentiel est rapide lors des premières tentatives et plus prudent lors des tentatives suivantes :```text
delay = min(cap, base * 2^attempt) + random(0, jitterRange)
attempt 0 → ~200ms
attempt 1 → ~400ms
attempt 2 → ~800ms
attempt 3 → ~1600ms
...
attempt N → cap'e ulaşır (örn. 30s)
```Sans l'ajout de gigue, cette formule est dangereuse : tous les travailleurs qui échouent en même temps réessayent exactement 200 ms, 400 ms, 800 ms plus tard et frappent la PSP par vagues synchrones. L'ajout d'un montant aléatoire (`full jitter` ou `decorrelated jitter`) émet cette onde.
## Différence entre réessayer et reporter
**Réessayer** : le travailleur réessaye la même demande dans le même processus après une courte attente, généralement en quelques secondes. **Différer** correspond au moment où le travail est remis dans la base de données ou dans la file d'attente et repris après une certaine période de temps (minutes voire heures). Une erreur à débit limité est généralement résolue par une nouvelle tentative ; Mais si la PSP elle-même subit une panne à grande échelle, rester dans la boucle de nouvelle tentative pendant quelques minutes épuisera le travailleur et les ressources. Le report est alors un moyen plus sûr de mettre le travail en « veille » pendant un certain temps.```text
Rate limited → retry (saniyeler, backoff ile)
Uzun süreli PSP kesintisi → defer (dakikalar, ayrı bir zamanlanmış tekrar)
```## Disjoncteur : quand arrêter complètement d'essayer
Lorsque les requêtes adressées à une dépendance échouent à plusieurs reprises, chaque nouvelle requête ne fait que reproduire un résultat déjà connu ; Cela consomme simplement des ressources et augmente la latence. Le disjoncteur fonctionne dans trois états :```text
Closed → istekler normal şekilde gönderilir
│ hata eşiği aşıldı
▼
Open → istekler hemen reddedilir, PSP'ye hiç gitmez
│ soğuma süresi geçti
▼
Half-Open → sınırlı sayıda deneme istek gönderilir
├─ başarılı → Closed
└─ başarısız → Open
```Le disjoncteur ne remplace pas une nouvelle tentative ; Il s'agit d'une couche supérieure qui détecte très tôt le moment où une nouvelle tentative produit du gaspillage. Pendant que le disjoncteur est activé, les travailleurs doivent se diriger vers la file d'attente différée et ne pas continuer à essayer en vain.
## Combien de tentatives, quel plafond
Ces chiffres ne doivent pas être arbitraires ; Il doit être proportionnel au propre SLA du PSP et à la valeur commerciale du travail. Pour un paiement de grande valeur, 8 à 10 tentatives et une fenêtre totale de 5 minutes peuvent être raisonnables ; Pour un processus en arrière-plan de faible priorité, 3 tentatives peuvent suffire.
## Distinctions souvent confuses```text
❌ Retry = defer
✓ Retry saniyeler içinde aynı process'te olur; defer işi dakikalarca bekletir
❌ Jitter isteğe bağlı bir iyileştirmedir
✓ Jitter'sız backoff, thundering herd riskini gerçek hale getirir
❌ Circuit breaker retry'ın alternatifidir
✓ Circuit breaker, retry'ı ne zaman durduracağını söyleyen üst katmandır
```## Gigue totale ou interruption sans gigue
| Critère | Sans gigue | Gigue complète |
| --- | --- | --- |
| Risque d'onde synchrone | Élevé | Faible |
| Modèle de chargement sur PSP | Pics soudains | Dispersé |
| Complexité des applications | Faible | Moins haut |
## Liste de contrôle lors de la configuration de l'algorithme de nouvelle tentative
1. Y a-t-il un plafond dans la formule d'attente, ou le temps de recharge peut-il théoriquement augmenter indéfiniment ?
2. La gigue est-elle appliquée ou tous les travailleurs réessayent-ils en même temps ?
3. Existe-t-il une distinction entre une nouvelle tentative/un report, une interruption à débit limité et une interruption à long terme ?
4. Les travailleurs arrêtent-ils vraiment d'envoyer des demandes au PSP lorsque le disjoncteur est activé ?
5. Le nombre de tentatives et la fenêtre totale ont-ils été déterminés par la valeur réelle du travail, ou s'agit-il d'un nombre aléatoire ?
6. Les transitions ouvert/semi-ouvert/fermé du disjoncteur sont-elles surveillées métriquement ?
## Ce qu'il faut retenir de cet article
1. Le recul exponentiel ne suffit pas à lui seul ; Produit des ondes synchrones sans gigue.
2. Réessayer et différer ne sont pas le même verbe : l'un correspond aux secondes, l'autre aux minutes-heures.
3. Le disjoncteur n'est pas une alternative à la nouvelle tentative, mais une couche de protection qui indique rapidement quand une nouvelle tentative devient inutile.
4. Le nombre de tentatives et le plafond doivent être choisis consciemment en fonction de la valeur réelle du travail.
> Un bon algorithme de nouvelle tentative ne cache pas l'échec ; Il contrôle le coût de l’échec.
Dans la section suivante, nous abordons le fonctionnement de ces nouvelles tentatives : comment la file d'attente des tâches et le mécanisme de location basés sur la base de données empêchent-ils que le même travail soit traité par deux travailleurs en même temps ?
FAQ
Frequently asked questions
Qu’est-ce que le recul exponentiel ?
Stratégie qui augmente le temps d'attente de façon exponentielle à chaque tentative : base * 2^tentative.
Qu’est-ce que la gigue ?
Déviation aléatoire ajoutée au temps d’attente ; Cela empêche plusieurs travailleurs de réessayer en même temps (troupeau tonnerre).
"retry=defer" est-il correct ?
La nouvelle tentative se produit dans le même processus en quelques secondes ; le report fait attendre le travail pendant des minutes
Que corrige cette section ?
Il ne faut pas confondre ici deux verbes différents : **réessayer** pour réessayer immédiatement au sein du même travailleur ; Si **différer**, laissez le travail attendre un moment, puis remettez-le dans la file d'attente. Les deux sons ressemblent à « réessayer », mais le timing et la responsabilité sont différents. Le recul exponentiel à lui seul ne suffit pas ; Produit des ondes synchrones sans gigue. Nous avons défini quatre catégories d'erreurs dans la section précédente. Cette section configure l'algorithme réel pour les trois catégories récupérables (requête après expiration du délai, débit limité, infrastructure) : combien de temps attendre, combien de fois essayer, quand s'arrêter complètement et allumer le disjoncteur.
Principes d'ingénierie appris
- L'interruption sans gigue produit des vagues de défaillance synchrones.
- Réessayer vaut quelques secondes, différer vaut minutes-heures – ce n'est pas le même verbe.
- Le disjoncteur arrête la nouvelle tentative plus tôt lorsqu'elle devient inutile.
Continuer la lecture
Continuer la lecture
Suivant en série
Base de données prise en charge fonctionne avec location
Location avec MISE À JOUR Conditionnelle, un observateur qui enregistre les tâches bloquées et pourquoi le simple fait de supprimer le message ne suffit…
Suivant en série
Taxonomie des erreurs de paiement
Les délais d'attente, 429, 5xx, le déclin de l'activité et les erreurs d'infrastructure ne sont pas la même chose.…
Même série
Travailleur au rapprochement des paiements dans la construction
Comment les balayeuses améliorent la dérive : Même si le PSP réussit, l'enregistrement local peut être expiré ; Comment récupérer un FinalizePending ancien.…