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(opcionalmenteSKIP LOCKEDpara 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.