Si imagina una empresa como Amazon (o cualquier otra aplicación web de comercio electrónico grande), que opera una tienda en línea a gran escala y solo tiene una cantidad limitada de artículos físicos en sus almacenes, ¿cómo pueden optimizar esto para que no haya solo cuello de botella? Por supuesto, deben tener varias bases de datos con replicación y muchos servidores que manejan la carga de forma independiente. Sin embargo, si varios usuarios están siendo atendidos por servidores separados y ambos intentan agregar el mismo artículo a su carrito, para lo cual solo queda uno, debe haber alguna "fuente de verdad" para la cantidad que queda para ese artículo. ¿No significa esto que, como mínimo, todos los usuarios que acceden a la información del producto para un solo artículo deben consultar la misma base de datos en serie?
Me gustaría entender cómo puede operar una tienda tan grande usando computación distribuida y no crear un gran cuello de botella en un solo DB que contiene información de inventario.
fuente
Respuestas:
Realmente no. Este no es un problema que requiera una solución técnica 100% perfecta, porque ambos casos de error tienen una solución comercial que no es muy costosa:
De hecho, recientemente experimenté el segundo caso, así que no es hipotético: eso es lo que sucede y cómo Amazon lo maneja.
Es un concepto que se aplica a menudo cuando tiene un problema que es teóricamente muy difícil de resolver (ya sea en términos de rendimiento, optimización o lo que sea): a menudo puede vivir con una solución que funciona realmente bien en la mayoría de los casos y aceptar que a veces falla, siempre que pueda detectar y manejar las fallas cuando ocurran.
fuente
Una combinación de
No hay magia, solo situaciones cada vez más complejas. Al igual que DNS, está hecho a escala.
La 'versión única de la verdad' es parte de tales sistemas. Generar una nueva clave se convierte en una operación más compleja que simplemente generar el siguiente número en la secuencia. Por ejemplo, existen otras secuencias. Este es el tipo de complejidad que los sistemas de bases de datos distribuidas pueden manejar y lo hacen al realizar varias operaciones hacia y desde los componentes al hacer nuevos objetos, ponerlos a disposición de otros, asegurando que las secuencias sean únicas cuando sea necesario, claves compuestas, etc. .
fuente
He visto el problema 'Último artículo en stock' resuelto de la siguiente manera:
Actualice todos los niveles de existencias diariamente y marque los productos como categorías alta, baja, en orden o fuera de stock de acuerdo con los niveles de umbral.
Obviamente, son los artículos de "bajo stock" los que son problemáticos
No te molestes en comprobar el nivel de existencias. Solo haz el pedido
Avise al usuario cuando navegue "¡Últimos pocos!". cuando van a pagar, verifique y disminuya el nivel de existencias. Si no está disponible, actualice el estado del artículo.
De esta manera, solo accede a la base de datos para los artículos de "bajo stock" y solo lo hace cuando el cliente está bastante lejos del proceso de compra. El costo es que algunos clientes no podrán completar su compra.
Sin embargo, en la mayoría de los casos, "agotado" realmente significa que está esperando otra entrega, por lo que desea aceptar el pedido de todos modos y tal vez solo aparezca una advertencia o restrinja las opciones de entrega. Entonces esos clientes no están perdidos.
Durante los tiempos de carga alta, como las ventas, incluso puede desactivar el control de existencias y enviar un correo electrónico a los clientes más tarde, 'lo siento, nos quedamos sin X, ¿le gustaría Y'?
Esencialmente, el objetivo de cualquier plataforma de comercio electrónico nunca se lee de la base de datos. Siempre sirva las páginas en caché y haga todo lo que sea del lado del cliente
fuente
En este video, Martin Fowler analiza las bases de datos NoSQL:
https://www.youtube.com/watch?v=qI_g07C_Q5I
Uno de los puntos (en algún lugar allí), es que lugares como Amazon prefieren mantener contento al 99% de las personas al aceptar su pedido sin poder verificar "con seguridad" si realmente está disponible, y tal vez irriten un porcentaje muy pequeño al tener para decir "lo siento, parece que alguien te ganó".
Es decir, no hay un manejo real para el escenario que describe, solo que Amazon aprovecha la duda en función de la última lectura de inventario exitosa, y si una transacción concurrente se deslizó en el medio - oopsie.
(por cierto, ese es un gran video si tienes curiosidad sobre NoSQL)
fuente