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 →