Fiabilidad · Media · 15 min

Reintentos con espera exponencial

Un modelo ocupado falla de vez en cuando. Reintenta sin martillear el servidor: 100, 200, 400 ms.

Escribe withRetry(fn, { retries, baseMs }). Llama a fn(); si lanza un error, espera con sleep(ms) y vuelve a intentarlo. La espera se duplica en cada intento: baseMs, baseMs * 2, baseMs * 4… Si se agotan los retries, lanza el último error.

Ya tienes sleep(ms) y makeFlaky(n), que crea una función que falla n veces y luego devuelve 'ok'. Usa siempre sleep: así los retos pueden comprobar las esperas.

Retos 0/4

  • Devuelve 'ok' tras dos fallos
  • Espera 100 y luego 200 ms (se duplica)
  • Lanza el error cuando se agotan los reintentos
  • No espera si funciona a la primera

async function withRetry(fn, { retries = 3, baseMs = 100 } = {}) {
  // prueba fn(); si falla, espera sleep(baseMs * 2 ** attempt) y vuelve a intentarlo
  return fn();
}

withRetry(makeFlaky(2), { retries: 3, baseMs: 100 }).then(console.log, (e) => console.error(e.message));
La consola aparece aquí (console.log).

Para profundizar: la referencia de AWS (en inglés) →

¿Esto en producción, con tus datos? Hablemos 15 minutos →