Condiciones de carrera: resolución de sincronización de inventario en tiempo real
Evitar la sobreventa durante las caídas de calor. Uso de Redis y Optimistic Locking para gestionar el stock en 5 canales.
Imagina que te queda 1 unidad de una zapatilla limitada. El usuario A está en su sitio web. El usuario B está en su aplicación. Ambos hacen clic en “Comprar” exactamente en el mismo milisegundo (12:00:00.001). Shopify recibe dos solicitudes. Si no se maneja correctamente, la zapatilla se vende dos veces. Ahora debe enviar un correo electrónico a un cliente y cancelar su pedido. Esto es un desastre de relaciones públicas.
6. Consistencia final (la regla de los 2 segundos)
Tu administrador de Shopify dice “Stock: 10”. Su ERP (NetSuite) dice “Stock: 8”. Su Almacén (WMS) dice “Stock: 9”. ¿Quién tiene razón? Ninguno de ellos. En un sistema distribuido, la coherencia es eventual. Necesitamos una fuente única de verdad para las acciones “asignadas”. Usamos Redis como la “tabla de asignación” autorizada. Solo después de enviar el pedido disminuimos el ERP.
7. Reservas de existencias de seguridad
“Si hay stock < 5, márquelo como Agotado”. Esta es una estrategia tosca pero eficaz para elementos de alto rendimiento. Si vende 100 artículos por segundo, la latencia de sincronización (200 ms) significa que podría sobrevender 20 artículos. Solución: Stock de Seguridad Dinámico. Si la velocidad de ventas > 10/min, aumente el stock de seguridad a 10. Si la velocidad de ventas <1/min, reduzca el buffer de seguridad a 0. Esto maximiza las ventas directas y, al mismo tiempo, lo protege del inventario negativo.
9. Tiendas oscuras y envío desde tienda
El inventario no está sólo en el almacén. Está en las tiendas minoristas. Implementamos Sincronización Omnicanal. La “Tienda insignia” en la Quinta Avenida también es el “Almacén n.° 2”. Si el almacén principal está fuera de servicio, el sistema verifica el inventario de la tienda. Enruta el pedido al iPad de la tienda. El empleado de la tienda recoge, empaqueta y envía. Esto desbloquea un 20% más de inventario que anteriormente estaba “atrapado” en los estantes.
10. Sincronización de logística de devolución
Cuando se inicia una devolución (/devoluciones), el artículo está técnicamente “en tránsito”.
No está “Disponible para vender”.
Pero sabemos que volverá.
Para artículos de alta demanda, podemos habilitar Pedidos pendientes.
“Disponible en 5 días” (Llegada prevista de devolución).
Sincronizamos los eventos del transportista logístico de devolución (FedEx Scan) para actualizar el estado en Shopify.
Esto recupera los ingresos de las ventas perdidas.
11. Conclusión: bloqueo optimista y Redis
No podemos confiar en que la base de datos simplemente indique “stock = 1”. Necesitamos un Bloqueo distribuido.
diagrama de secuencia
Usuario participanteA
Usuario participanteB
participante Redis
participante Shopify
UsuarioA->>Redis: bloqueo SETNX: sku_123 1
Redis-->>UsuarioA: OK (Bloqueo adquirido)
UsuarioB->>Redis: bloqueo SETNX: sku_123 1
Redis-->>UsuarioB: FALLO (Bloqueado)
UsuarioA->>Shopify: Crear caja
Shopify-->>UsuarioA: pedido exitoso
UsuarioA->>Redis: bloqueo DEL:sku_123
UsuarioB->>UI: Mostrar error "Agotado"
1. El sistema de reservas
Cuando un usuario agrega un artículo de alto calor al carrito, lo reservamos en Redis durante 10 minutos.
ESTABLECER reserva:sku_123:user_abc EX 600
Esto disminuye el stock disponible inmediatamente, incluso antes de que se realice la compra.
Si no compran en 10 minutos, la clave caduca y las acciones regresan al fondo común.
Webhooks para sincronización
Cuando realiza un pedido, debemos informar a Amazon y TikTok de inmediato.
El webhook INVENTORY_LEVEL_UPDATE de Shopify es nuestro disparador.
Llevamos este evento a un Event Bus (Amazon EventBridge).
Las funciones lambda de despliegue actualizan los mercados externos en paralelo. (Latencia: <200 ms).
12. Manejo del “rebaño atronador”
Cuando 50.000 usuarios accedan al sitio a las 10 a. m., su base de datos morirá. Conectarse a Postgres para cada verificación de inventario es un suicidio. Redis maneja 100.000 operaciones por segundo. Usamos Almacenamiento en caché de lectura.
- La aplicación pregunta a Redis: “¿Existen existencias para SKU-123?”
- Redis dice: “Señorita”.
- La aplicación le pregunta a DB: “El stock es 100”.
- La aplicación le dice a Redis: “SET SKU-123 100 TTL 10sec”. Esto reduce la carga de la base de datos en un 99%. Pero, ¿qué pasa si se pierden 1000 solicitudes al exactamente al mismo tiempo? Todos golpearon el DB. Usamos Expiración anticipada probabilística o Coalescencia de solicitudes (SingleFlight) para garantizar que solo UNA solicitud llegue a la base de datos para calentar el caché.
Por qué Maison Code analiza esto
En Maison Code, diseñamos Sistemas de lanzamiento de alta temperatura. Hemos sobrevivido al tráfico del Black Friday para las principales marcas de ropa urbana. Sabemos que la “sobreventa” no es un “problema de operaciones”; es un “fracaso arquitectónico”. Construimos mecanismos de bloqueo distribuido que garantizan una fuerte consistencia incluso a escala masiva. Valoramos su reputación. Un pedido cancelado es un cliente perdido para siempre.
14. Conclusión
La sincronización de inventario es el problema más difícil del comercio electrónico. Lucha contra la Física (Latencia) y la Probabilidad (Condiciones de carrera). No se puede ganar con “Consultas simples”. Necesita almacenamiento en caché, bloqueo y cola. Necesitas diseñar para el fracaso.
¿Vendes demasiado durante las rebajas?
Implementamos High-Performance Inventory Sync basada en Redis para garantizar un 0% de sobreventa.