La integración era con la API de un proveedor de envíos. El contrato decía diez llamadas por minuto. El limitador salió en veinte líneas: un contador, la marca del minuto en curso y, si el minuto cambiaba, contador a cero. Tests en verde. A producción.
A los pocos días, 429 por todas partes. Y lo desconcertante era el panel del proveedor: veinte llamadas en dos segundos. Veinte, con un limitador de diez.
El fallo no estaba en el contador, estaba en el borde
Ventana fija: diez llamadas en el segundo 58 y otras diez en el 02 del minuto siguiente. Tu contador está impecable, nunca pasó de diez dentro de ningún minuto. Pero el proveedor no mide tus minutos, mide los suyos, y en el intervalo de sesenta segundos que queda a caballo entre los dos hay veinte. El doble del límite por diseño, no por descuido.
Los tests no lo veían porque disparaban las llamadas una detrás de otra, todas dentro de la misma ventana. El único caso que rompe era justo el que nadie había escrito: cruzar el borde.
Dónde se gana el sueldo el modelo local
No escribiendo el limitador, que eso lo sabe hacer cualquiera. Le pegué el módulo entero y le pedí lo incómodo:
Escribe el test que hace fallar esto. Quiero controlar el reloj y quiero ver el instante exacto en el que pasan más de diez en sesenta segundos.
De ahí salió el test con reloj falso y, ya con el fallo a la vista, la conversación de verdad: qué poner en su lugar.
- Cubo de fichas: capacidad diez, reposición a ritmo constante. La capacidad te da control explícito sobre la ráfaga, que es precisamente lo que la ventana fija regalaba sin preguntar.
- Reloj monótono, no la hora del sistema. Un ajuste de hora hacia atrás no debería regalar permisos.
- Retry-After manda. Si el proveedor te dice que esperes, esperas, aunque tu contador jure que te quedan fichas.
- Y decidir en serio qué pasa con lo que no cabe: encolar o fallar rápido. No es lo mismo un webhook que un botón que alguien está mirando.
Por qué esto se hace en local
Ese módulo no era un ejemplo de manual. Llevaba dentro la URL del proveedor, los nombres de nuestras rutas internas y la cabecera de autenticación. Para que la ayuda sirva de algo hay que enseñar el fichero de verdad, con sus nombres y sus fronteras, y esa es exactamente la parte que uno no tiene ganas de pegar en la web de nadie.
Con el modelo corriendo dentro del navegador, sobre tu propia GPU, la pregunta ni llega a plantearse: el código, el prompt y las respuestas se quedan en la pestaña. Sin cuenta, sin cuota, y sin conexión si hace falta. No es una promesa escrita en una política de privacidad; es que no hay a dónde enviarlo.
Abre Elffuss Code, pégale tu módulo y pídele el test que lo rompe: corre entero en el navegador, así que ni tu código ni tu prompt salen de tu máquina.
Abrir Code →