Víctor Sans de Amores

Inicio / Casos / El batch que mintió

El batch que dijo «completo» después de leer el 21% de los datos

11 de agosto de 2026 menudojuego.com — proyecto propio NestJS · Prisma · PostgreSQL
Página «Los mayores descuentos de hoy» de menudojuego.com: 48 juegos con más de un 75% de descuento, en una rejilla de portadas con el porcentaje de rebaja y el precio en cada una
Los mayores descuentos del día en menudojuego.com. Esta página solo puede existir si el barrido del catálogo es completo y fiable — y durante semanas no lo fue sin que nada lo delatara.

La web menudojuego.com compara precios de videojuegos entre tiendas. En julio, 102 de sus 3.346 fichas tenían un precio. El resto era un comparador de precios sin nada que comparar.

Los precios vienen de una API de terceros con un límite de peticiones que no está documentado en ninguna parte: 15.780 registros, de cincuenta en cincuenta, y cualquier ritmo por encima de una petición por segundo se gana un 429 y un bloqueo de varios minutos.

La parte que merece contarse

Mi bucle de barrido terminaba cuando una página venía vacía: así se detecta el final del catálogo. Pero también terminaba cuando una petición fallaba, porque escribí las dos condiciones igual. Cuando el límite de la API saltó en el registro 3.300, el job paró, escribió «barrido completo» en el log y salió con código cero. Todas las señales decían que había funcionado. Había visto el 21% de los datos.

Reconstrucción de los logs, antes y después del arreglo. Las cifras son las reales de aquella ejecución.

Desde entonces es lo primero que miro en cualquier batch ajeno. No el que revienta — ese se nota el mismo día. El que reporta éxito con datos parciales se descubre en octubre, cuando alguien pregunta por qué un número está bajo, y para entonces ya nadie se fía de ningún número.

El arreglo

No fue solo la condición del bucle. Ahora un fallo activa un aviso explícito de barrido INCOMPLETO en el log; los reintentos esperan 60, 120 y 180 segundos; y un mutex impide que la ejecución programada arranque encima de una manual — que ya había pasado una vez, con los dos procesos limitándose el ritmo mutuamente durante dos horas.

Con los datos ya fiables, cada juego incorporó su mínimo histórico, para que la ficha responda a la pregunta que el visitante trae de verdad: no cuánto cuesta, sino si es buen momento para comprar.

Bloque de comparación de precios: mejor precio 5,79 € en Steam con un 70% de descuento frente a 19,31 € en otras tres tiendas, con la frase «Está en su mínimo histórico, el mismo precio que en junio de 2025»
El mínimo histórico en una ficha real: «Está en su mínimo histórico, el mismo precio que en junio de 2025». Una frase que solo se puede escribir sobre datos completos.

Dónde está hoy

A 11 de agosto de 2026: 2.696 juegos con precios refrescados a las 05:00 y a las 17:00 cada día, desde los 102 de julio. 2.531 con mínimo histórico registrado, servido con marcado schema.org para que también lo lea un rastreador.

Lo que sigue mal, y lo digo yo antes de que lo encuentres tú

79 juegos muestran un precio actual por debajo de su propio «mínimo histórico», porque esa cifra viene de la API y aún no se recalcula con lo que yo mismo observo. Está en la lista.

Stack: NestJS, Prisma, PostgreSQL, Next.js 15, Docker, cron sobre VPS autogestionado. Proyecto propio, sin nada confidencial: por eso está contado entero.

¿Hay números en tu sistema de los que ya nadie se fía?

Un informe que no cuadra, un proceso nocturno del que nadie sabe decir si terminó bien, una integración que falla en silencio. Ese es exactamente el tipo de trabajo que hago. Respondo en un día laborable.