POLITICA DE COOKIES

Q2BSTUDIO.COM utiliza cookies técnicas, analíticas, de sesión y de publicidad con la finalidad de prestar un mejor servicio. No obstante, necesitamos su consentimiento explícito para poder utilizarlas. Así mismo puede cambiar la configuración de las cookies u obtener más información aquí .

Condiciones de Carrera a la Resiliencia: Reservas a Prueba de Fallos

Condiciones de Carrera hacia la Resiliencia: Reservas a Prueba de Fallos

Publicado el 23/08/2025

Introducción

¿Qué ocurre cuando dos usuarios intentan reservar el último producto exactamente al mismo tiempo? Muchos sistemas fallan vendiendo el mismo artículo dos veces y provocando cancelaciones, reembolsos y clientes enfadados. Este problema no es teórico, es una falla fundamental en el manejo de operaciones concurrentes y requiere un enfoque cuidadoso para garantizar consistencia y resiliencia.

El viaje desde lo ingenuo hasta lo resistente

Empecé con una implementación simple: comprobar stock en la base de datos y crear la reserva. Con Node.js y llamadas secuenciales esto funciona para pocos usuarios, pero cuando llegan dos peticiones simultáneas aparece la condición de carrera. Request A y Request B leen 1 unidad en stock, ambos crean una reserva y el stock llega a 0 y luego a -1. La solución requiere convertir la sección crítica en una operación atómica.

Herramientas elegidas

Para construir un sistema fiable opté por una pila concreta y por razones claras: PostgreSQL como fuente de verdad por su ACID y consistencia; Redis no solo como caché sino como servidor de estructuras de datos de alta velocidad para operaciones atómicas; Node.js con Express para APIs no bloqueantes; y BullMQ como cola robusta para manejar el trabajo en segundo plano y permitir reintentos automáticos.

Atomicidad con Lua en Redis

Las transacciones simples pueden quedar cortas por el ida y vuelta entre servidor y cliente. En lugar de usar WATCH, MULTI y EXEC, encapsulé la lógica de comprobar y decrementar stock en un script Lua ejecutado dentro de Redis. Redis garantiza la ejecución atómica de scripts Lua, por lo que no existe la ventana entre check y update. Con esta técnica eliminamos por completo la condición de carrera para reservas simultáneas.

Persistencia y TTL para carritos abandonados

Una vez asegurado el inventario en Redis, la reserva se persiste en PostgreSQL y se crea una llave con TTL en Redis para manejar tiempos de expiración de carritos. ¿Qué pasa cuando ese temporizador expira? Evité Pub/Sub por ser fire and forget y opté por un worker que consulta proactivamente cada 30 segundos la base de datos en busca de reservas expiradas. Así el sistema es autocurativo: si el worker estuvo caído, al reiniciarse encontrará y limpiará las reservas pendientes, garantizando eventual consistency.

Reducir la charla en la red

El checkout inicial era muy conversador, con múltiples llamadas a Redis por cada item en el carrito. Para carritos grandes esto generaba decenas de round trips. La solución fue delegar la validación completa del carrito a un único script Lua experto que valida todo de forma atómica y devuelve el resultado en una sola llamada, reduciendo latencia y costes de red.

Desacoplar con colas para tolerancia a fallos

Para proteger la compra frente a fallos en la base de datos o reinicios de servidor, el API solo encola una tarea en BullMQ. El usuario recibe respuesta instantánea y un worker asíncrono procesa la operación lenta contra PostgreSQL. Esta arquitectura aporta respuestas rápidas, reintentos automáticos y evita pérdidas de pedidos durante caídas.

Idempotencia y máquina de estados

Para soportar reintentos seguros el worker debe ser idempotente. Implementé una máquina de estados en la tabla de reservas: pending - processing - completed. Al iniciar un job el worker marca la reserva como processing. Si un job retry llega y la reserva ya está completed, el worker detecta que no hay trabajo pendiente y evita decrementar stock de nuevo. Así el procesamiento puede reintentarse muchas veces sin efectos duplicados.

Manejo humano de fallos y limpieza automática

Si un trabajo falla tras varios reintentos automáticos, no podemos dejarlo en el limbo. La cola de fallos funciona como lista de tareas para un operador humano que puede revisar el error y optar por retry o cancel. Además implementé un limpiador cron que periódicamente expira trabajos en la cola de fallos que lleven demasiado tiempo, cancela reservas y devuelve stock, evitando pérdida permanente de inventario.

Arquitectura final

La solución completa queda así: capa API rápida y stateless que usa Redis para operaciones atómicas; capa de colas con BullMQ para procesamiento en background; workers idempotentes que garantizan consistencia; PostgreSQL como fuente de verdad; panel administrativo para supervisión humana; y procesos de limpieza automática. Este diseño prioriza resiliencia, escalabilidad y mantenimiento.

Lecciones aprendidas

Atomicidad es imprescindible para operaciones concurrentes. Eventual consistency supera a la inconsistencia en tiempo real cuando la fiabilidad es prioritaria. Desacoplar responsabilidades crea resistencia ante fallos. Diseñar idempotencia desde el inicio permite recuperaciones seguras. Y la supervisión humana complementa la automatización para casos límite.

Sobre Q2BSTUDIO

En Q2BSTUDIO somos una empresa de desarrollo de software especializada en aplicaciones a medida y software a medida, con experiencia en inteligencia artificial, ia para empresas y agentes IA. Ofrecemos soluciones integrales de ciberseguridad, servicios cloud aws y azure, y servicios inteligencia de negocio con implementaciones prácticas usando power bi. Diseñamos arquitecturas resilientes como la descrita, combinando bases de datos robustas, cache y scripting en Redis, colas de trabajo como BullMQ y prácticas de idempotencia para garantizar que las operaciones críticas nunca se pierdan.

Cómo podemos ayudar

Si necesita una solución a medida para reserva de inventario, gestión de pedidos, integración de inteligencia artificial o dashboards de inteligencia de negocio con power bi, Q2BSTUDIO puede diseñar e implementar la arquitectura completa. Ofrecemos servicios de software a medida, aplicaciones a medida, implementación de agentes IA, consultoría en ciberseguridad y migraciones a servicios cloud aws y azure para que su plataforma sea segura, escalable y eficiente.

Recursos y contacto

Puede consultar un ejemplo de proyecto y código de referencia en GitHub https://github.com/TheBigWealth89/product_reservation y contactar a Q2BSTUDIO para evaluar su caso y recibir una propuesta personalizada en soluciones de software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA y power bi.

Fin del artículo, inicio de la diversión
Construyendo software juntos

Dando vida a tus ideas desde 2008

Diseñamos aplicaciones móviles y de escritorio innovadoras que cumplen con tus requisitos específicos y mejoran la eficiencia operativa.
Más info
Cuéntanos tu visión
Sea cual sea el alcance, podemos convertir tu idea en realidad. Envíanosla y charlemos sobre tu proyecto o una colaboración futura.
Contáctanos
artículos destacados
Live Chat
Enviado correctamente.

Gracias por confiar en Q2BStudio