Playbook
Algoritmos de reintento para trabajadores de pagos (Algoritmos DE Reintento Para Trabajadores DE Pagos)
Retroceso exponencial, fluctuación, límite, diferencia de aplazamiento versus reintento y disyuntor: traduzca la taxonomía de la sección anterior a un código de trabajo.
Motor de pago distribuido
Parte 12 de 22
Una serie de arquitecturas de pago distribuidas que cierran la brecha entre la captura y la finalización.
Definimos cuatro categorías de error en la sección anterior. Esta sección configura el algoritmo real para las tres categorías que se pueden recuperar (consulta posterior al tiempo de espera, velocidad limitada, infraestructura): cuánto tiempo esperar, cuántas veces intentar, cuándo detenerse por completo y encender el disyuntor.```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
## Conceptos en la primera mención```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ı.
```La interrupción sin fluctuaciones provoca que cientos de trabajos que fallan al mismo tiempo se vuelvan a intentar en el mismo milisegundo, lo que coloca a un PSP ya estresado en una situación aún peor.
## Fórmula de retroceso y por qué la espera constante no es suficiente
La espera fija de 1 segundo es simple, pero tiene dos problemas: 1 segundo puede no ser suficiente si la PSP realiza una ráfaga corta; Si PSP ya se ha recuperado, 1 segundo es una lentitud innecesaria. El retroceso exponencial es rápido en los primeros intentos y más cauteloso en los intentos posteriores:```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)
```Sin la adición de jitter, esta fórmula es peligrosa: todos los trabajadores que fallan al mismo tiempo vuelven a intentarlo exactamente 200 ms, 400 ms, 800 ms después y golpean la PSP en ondas sincrónicas. Agregar una cantidad aleatoria (`full jitter` o `decorrelated jitter`) emite esta onda.
## Diferencia entre reintentar y aplazar
**Reintentar**: el trabajador vuelve a intentar la misma solicitud en el mismo proceso después de una breve espera, generalmente en cuestión de segundos. **Aplazar** es cuando el trabajo se vuelve a colocar en la base de datos o en la cola y se retoma después de un cierto período de tiempo (minutos o incluso horas). Un error de tasa limitada generalmente se resuelve reintentando; Pero si el propio PSP está experimentando una interrupción a gran escala, permanecer en el ciclo de reintento durante minutos agotará al trabajador y los recursos; en ese momento, posponer es una forma más segura de poner el trabajo en "suspensión" por un tiempo.```text
Rate limited → retry (saniyeler, backoff ile)
Uzun süreli PSP kesintisi → defer (dakikalar, ayrı bir zamanlanmış tekrar)
```## Disyuntor: cuándo dejar de intentarlo por completo
Cuando las solicitudes a una dependencia fallan repetidamente, cada nueva solicitud no hace más que reproducir un resultado ya conocido; Simplemente consume recursos y aumenta la latencia. El disyuntor funciona en tres estados:```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
```El disyuntor no reemplaza el reintento; Es una capa superior que detecta tempranamente el momento en que el reintento produce desperdicio. Mientras el disyuntor esté encendido, los trabajadores deberán dirigirse a la cola diferida y no seguir intentándolo en vano.
## ¿Cuántos intentos, cuánto límite?
Estas cifras no deberían ser arbitrarias; Debe ser proporcional al SLA del propio PSP y al valor comercial del trabajo. Para un pago de alto valor, pueden ser razonables entre 8 y 10 intentos y un período total de 5 minutos; Para un proceso en segundo plano de baja prioridad, 3 intentos pueden ser suficientes.
## Distinciones frecuentemente confusas```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
```## Jitter total versus retroceso sin jitter
| Criterio | Sin inquietudes | Nerviosismo total |
| --- | --- | --- |
| Riesgo de onda síncrona | Alto | Bajo |
| Patrón de carga en PSP | Picos repentinos | Dispersos |
| Complejidad de la aplicación | Bajo | Menos superior |
## Lista de verificación al configurar el algoritmo de reintento
1. ¿Hay un límite en la fórmula de retroceso o, en teoría, el tiempo de reutilización puede crecer indefinidamente?
2. ¿Se aplica Jitter o todos los trabajadores vuelven a intentarlo al mismo tiempo?
3. ¿Se hace una distinción entre reintento/diferimiento entre interrupción de tarifa limitada e interrupción a largo plazo?
4. ¿Los trabajadores realmente dejan de enviar solicitudes al PSP cuando el disyuntor está activado?
5. ¿El número de intentos y la ventana total fueron determinados por el valor real del trabajo o es un número aleatorio?
6. ¿Se controlan métricamente las transiciones de abierto/semiabierto/cerrado del disyuntor?
## Lo que debes recordar de este artículo
1. El retroceso exponencial por sí solo no es suficiente; Produce ondas sincrónicas sin fluctuaciones.
2. Reintentar y aplazar no son el mismo verbo: uno es para segundos, el otro es para minutos-horas.
3. El disyuntor no es una alternativa al reintento, sino una capa de protección que indica tempranamente cuándo el reintento se convierte en un desperdicio.
4. El número de intentos y el límite deben elegirse conscientemente de acuerdo con el valor real del trabajo.
> Un buen algoritmo de reintento no oculta el error; Controla el costo del fracaso.
En la siguiente sección, profundizamos en dónde funcionan estos reintentos: ¿cómo evita la cola de trabajos respaldada por la base de datos y el mecanismo de concesión que dos trabajadores procesen el mismo trabajo al mismo tiempo?
FAQ
Frequently asked questions
¿Qué es el retroceso exponencial?
Estrategia que aumenta exponencialmente el tiempo de espera con cada intento: base * 2^intento.
¿Qué es la inquietud?
Desviación aleatoria añadida al tiempo de espera; Impide que varios trabajadores vuelvan a intentarlo al mismo tiempo (rebaño atronador).
¿Es correcto "reintentar = aplazar"?
El reintento ocurre en el mismo proceso en segundos; aplazar hace que el trabajo espere minutos
¿Qué soluciona esta sección?
Aquí no se deben confundir dos verbos diferentes: **retry** para volver a intentarlo inmediatamente dentro del mismo trabajador; Si se **aplaza**, mantenga el trabajo en espera por un tiempo y luego vuelva a colocarlo en la cola. Ambos suenan como "inténtalo de nuevo", pero el momento y la responsabilidad son diferentes. El retroceso exponencial por sí solo no es suficiente; Produce ondas sincrónicas sin fluctuaciones. Definimos cuatro categorías de error en la sección anterior. Esta sección configura el algoritmo real para las tres categorías que se pueden recuperar (consulta posterior al tiempo de espera, velocidad limitada, infraestructura): cuánto tiempo esperar, cuántas veces intentar, cuándo detenerse por completo y encender el disyuntor.
Principios de ingeniería aprendidos
- El retroceso sin fluctuaciones produce ondas de falla sincrónicas.
- Reintentar son segundos, aplazar son minutos-horas; no es el mismo verbo.
- El disyuntor detiene el reintento antes de tiempo cuando resulta un desperdicio.
Continuar leyendo
Continuar leyendo
Siguiente en la serie
Trabajos compatibles con bases de datos con arrendamiento
Arrendamiento con ACTUALIZACIÓN condicional, observador que salva trabajos estancados y por qué simplemente mostrar el mensaje no es suficiente para pagar…
Siguiente en la serie
Taxonomía de errores de pago
El tiempo de espera, 429, 5xx, la caída del negocio y el error de infraestructura no son lo mismo.…
Misma serie
Trabajador de conciliación de pagos de construcción
Cómo los barrenderos mejoran la deriva: si bien PSP tiene éxito, el registro local puede estar vencido; Cómo recuperar FinalizePending envejecido.