Cómo Shopify sustituyó Redis por MySQL en las reservas de inventario

Fuentes: How Shopify replaced Redis with MySQL for inventory reservations

Shopify ha sustituido Redis por MySQL como base del sistema que reserva inventario durante el proceso de pago, un cambio motivado por la necesidad de unificar su infraestructura de datos y mantener garantías ACID entre la reserva temporal y el descuento definitivo cuando el pago se confirma. El problema central que aborda el sistema de protección contra sobreventa es doble: si dos compradores pujan a la vez por la última unidad, el comerciante debe cancelar un pedido y asumir el coste de soporte; si el sistema bloquea unidades disponibles, pierde ventas que debería haber cerrado.

La solución anterior, basada en Redis con operaciones DECR/INCR sobre una clave de cantidad, ofrecía buen rendimiento bajo concurrencia, pero obligaba a mantener dos sistemas separados para reservas y libro mayor de inventario. Eso impedía envolver ambas operaciones en una transacción atómica, abriendo la puerta a sobreventas o ventas perdidas.

El nuevo diseño se apoya en la cláusula SKIP LOCKED de MySQL 8: en lugar de una fila por producto con una columna de cantidad, se usa una fila por unidad vendible, y la reserva selecciona y mueve N filas en una sola transacción. Para evitar tablas inmanejables, se mantiene un pool acotado de 1.000 filas disponibles por combinación de producto y ubicación, que un proceso de reposición rellena desde el libro mayor.

El artículo describe tres decisiones técnicas clave: una clave primaria compuesta para reducir de dos a uno los bloqueos por fila; el nivel de aislamiento READ COMMITTED para evitar bloqueos por hueco durante la reposición; y un orden consistente de adquisición de bloqueos entre reserva y confirmación para eliminar interbloqueos.