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());Para profundizar: la guía relacionada →
¿Esto en producción, con tus datos? Hablemos 15 minutos →