Saltar al contenido
← Todos los proyectos
Web

Plataforma de Alta Concurrencia y Sorteos

Sistema transaccional que asigna folios en tiempo real bajo carga simultánea, evitando condiciones de carrera con bloqueos de fila en PostgreSQL.

  • Laravel 11
  • Vue 3
  • PostgreSQL
  • Tailwind CSS
  • Stripe Connect
Row-level
Estrategia de bloqueo
ACID
Consistencia
Tiempo real
Asignación

Problema

En un sorteo, miles de usuarios intentan reservar los mismos folios al mismo tiempo. Sin control de concurrencia aparecen condiciones de carrera: el mismo folio vendido dos veces, cobros sin asignación o inventario inconsistente. Además, el pago y la asignación deben ser atómicos.

Solución de Arquitectura

  • Bloqueos a nivel de fila en PostgreSQL dentro de una transacción: los folios candidatos se seleccionan con SELECT ... FOR UPDATE (opcionalmente SKIP LOCKED para no bloquear a otros compradores), se marcan como reservados y se confirman en un único commit.
BEGIN;
SELECT id, number
  FROM tickets
 WHERE raffle_id = :raffle AND status = 'available'
 ORDER BY number
 LIMIT :qty
   FOR UPDATE SKIP LOCKED;

UPDATE tickets
   SET status = 'reserved', order_id = :order, reserved_until = now() + interval '10 minutes'
 WHERE id = ANY(:ids);
COMMIT;
  • Reservas con expiración: los folios apartados se liberan automáticamente si el pago no se completa.
  • Pagos con Stripe Connect: confirmación vía webhooks idempotentes; la asignación definitiva ocurre solo cuando el pago queda confirmado.
  • Interfaz reactiva en Vue 3 + Tailwind CSS: el estado de los folios se actualiza en tiempo real para que el usuario vea disponibilidad vigente.

Stack

Laravel 11 · Vue 3 · PostgreSQL · Tailwind CSS · Pasarelas de pago / Stripe Connect

Resultado Clave

La integridad de la asignación la garantiza la base de datos, no la aplicación: ningún folio puede asignarse dos veces aunque lleguen solicitudes simultáneas, y la interfaz refleja la disponibilidad en tiempo real.