Arquitectura para ventas relámpago: absorber picos sin vender stock inexistente
Una oferta popular sincroniza páginas de producto, consultas de stock, inicios de pago y reintentos en pocos segundos. El objetivo de ingeniería no es volver infinitamente rápido cada servicio, sino admitir trabajo a un ritmo que la compra pueda completar, proteger la autoridad del inventario y garantizar un desenlace recuperable para cada pedido aceptado.
Publicado el 28 de septiembre de 202615 min de lecturaControl de tráfico y fiabilidad del checkout
Escalar la navegación no equivale a escalar las compras
Distribuye en la CDN imágenes, descripciones y datos de catálogo que se puedan almacenar sin riesgo. El precio personalizado, el estado de la cuenta, la promesa de disponibilidad y las decisiones del checkout deben seguir en sus fuentes autoritativas. La CDN absorbe lecturas repetidas; no vuelve ilimitadas las escrituras de una pasarela o una fila muy concurrida de inventario. Un contador en caché informa, pero no reserva.
Regula la demanda antes de que llegue al escaso camino transaccional
1 / BordeCaché de catálogo, filtro de abuso y protección del origen.
2 / AdmisiónSala de espera o límites liberan un flujo acotado de compradores.
3 / CheckoutLimita concurrencia y crea un intento persistente por pedido.
4 / InventarioReserva unidades de forma atómica, con dueño y vencimiento.
5 / PagoAutoriza con una clave idempotente estable y reconcilia el resultado.
La sala de espera modifica la tasa de llegada, no la capacidad del backend. Ajusta la admisión con pruebas de carga y cuotas de los servicios dependientes; observa antigüedad de la cola, abandonos y conversiones. Una cola acotada necesita vencimiento y una respuesta clara cuando se llena. Sin límites, solo traslada la sobrecarga a memoria, almacenamiento o una tormenta de reintentos.
El inventario necesita una fuente de verdad
Modela cantidades disponibles, reservadas y confirmadas. La reserva debe surgir de una operación atómica en la autoridad de inventario, por ejemplo, una actualización condicional que solo tenga éxito si quedan unidades suficientes. Un bloqueo distribuido por sí solo no es un modelo de inventario: los leases vencen, los clientes pueden pausarse y el bloqueo no indica qué pedido es dueño de cada unidad.
Asocia cada reserva con un pedido, cantidad, hora y vencimiento. Cuando el pago tiene éxito, convierte la reserva en inventario comprometido una sola vez. Ante un rechazo, cancelación o expiración según la política, libérala mediante una transición idempotente. Un reconciliador debe localizar reservas vencidas y corregir estados atascados. Particionar el stock puede reducir la contención, pero hace falta una política explícita entre particiones para que los contadores locales no superen el total.
Los reintentos de pago necesitan identidad y estado
Un timeout de red no demuestra que el cobro haya fallado: el proveedor pudo completar la operación y perderse la respuesta. Persiste el intento y reutiliza la misma clave de idempotencia en los reintentos de esa operación lógica, con parámetros idénticos. No generes otra clave porque el cliente agotó el tiempo; primero consulta o reconcilia el intento. El estado del pedido debe distinguirse del estado de transporte del proveedor.
Los webhooks pueden repetirse o llegar fuera de orden. Persiste los IDs de evento, haz idempotentes los controladores, verifica firmas y permite solo transiciones válidas. Un registro outbox escrito en la misma transacción local del pedido permite publicar más tarde si falla la publicación al broker. Eso no convierte la base de datos y el broker en una transacción atómica compartida.
Coordina la compra como una saga
Los servicios de inventario, pedidos y pagos normalmente no comparten una transacción ACID entre sí. Modela el checkout como una máquina de estados persistente: crear pedido, reservar stock, solicitar autorización y confirmar. Si se rechaza el pago, libera la reserva y marca el pedido como fallido. Si la autorización se completó y falla un paso posterior, anula o reembolsa según el ciclo del proveedor y la política comercial. Compensar es ejecutar otra acción, no retroceder el tiempo; esa acción también puede fallar y requiere reintentos, alertas y reconciliación.
Fallo observado
Reacción insegura
Recuperación controlada
Timeout del checkout
Crear otro pedido con una identidad nueva.
Buscar el intento persistente y mostrar su estado actual.
Respuesta ambigua del pago
Asumir rechazo o volver a cobrar.
Repetir con la misma clave y reconciliar con el proveedor.
Webhook duplicado
Aplicar dos veces los cambios de pago y stock.
Deduplicar el evento y validar la transición.
Vence una reserva
Retener stock o liberarlo después de cobrar.
Definir vencimiento y comprobar el pago antes de liberar.
Consumidor retrasado
Dejar crecer una cola ilimitada.
Aplicar backpressure, retención acotada y control de admisión.
Observa el recorrido del cliente, no solo la CPU
Mide llegadas admitidas y rechazadas, tiempo de espera, conversión del checkout, reservas exitosas y su antigüedad, stock disponible frente al retenido, latencia de autorización, intentos ambiguos, webhooks duplicados, retraso de cola y fallos de compensación. Segmenta por campaña, producto y región sin introducir datos personales en las etiquetas. Alerta por impacto al cliente y estados bloqueados, no por cada reintento transitorio.
Antes de la campaña, reproduce tráfico realista en un entorno parecido a producción. Incluye contención por producto popular, commits lentos, timeout del proveedor, webhooks repetidos y desordenados, reinicios de workers y recuperación del backlog. Prepara un interruptor para detener nuevas admisiones mientras los pedidos aceptados se reconcilian. Informa posición, vencimiento y estado: actualizar la página sin parar solo amplifica la carga.
En resumen
Una venta relámpago fiable comienza con un límite de capacidad conocido. Almacena en caché lo seguro, admite trabajo transaccional al ritmo que el sistema soporta, reserva el inventario de forma atómica y vuelve duraderas e idempotentes las transiciones de pedido y pago. Las colas suavizan los picos, pero no eliminan los cuellos de botella. Pruebas de carga, estados claros y reconciliación convierten los fallos parciales en un proceso operable.