Fiabilidad · Media · 20 min

Limita el ritmo con un cubo de fichas

Tu API delante del modelo debe aceptar ráfagas cortas sin dejar que nadie la acapare. El cubo de fichas hace las dos cosas.

Escribe createBucket({ capacity, refillPerSec, now }) que devuelva un objeto con tryTake().

El cubo empieza lleno con capacity fichas. tryTake() gasta una ficha y devuelve true, o devuelve false si no queda ninguna entera. Las fichas se recargan a refillPerSec por segundo (también fracciones), sin pasar nunca de capacity.

Lee la hora siempre con now() (en milisegundos): así los retos usan un reloj falso. Ya tienes makeClock(), que devuelve { now, advance(ms) }.

Retos 0/4

  • Empieza lleno y se vacía
  • Recarga una ficha por segundo
  • Nunca pasa de la capacidad
  • Acumula fracciones de ficha

function createBucket({ capacity, refillPerSec, now = () => Date.now() }) {
  let tokens = capacity;
  return {
    tryTake() {
      // suma (segundos transcurridos * refillPerSec) tokens, sin pasar de capacity
      if (tokens >= 1) { tokens -= 1; return true; }
      return false;
    },
  };
}

const clock = makeClock();
const bucket = createBucket({ capacity: 2, refillPerSec: 1, now: clock.now });
console.log(bucket.tryTake(), bucket.tryTake(), bucket.tryTake());
clock.advance(1000);
console.log('after 1 s:', bucket.tryTake());
La consola aparece aquí (console.log).

Para profundizar: la guía relacionada →

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