Diez mil pedidos un domingo
Un supermercado online recibe diez mil pedidos el domingo por la tarde. Cada cliente mira precios, llena el carrito y paga. Después le llega un correo y el almacén imprime su albarán.
Todo eso no lo hace un único programa. Lo hacen varias piezas, cada una con su tarea. Hoy aprendes a dibujarlas.
Al final de esta lección
Nota
Puedo dibujar cómo encajan las piezas de una aplicación web sencilla.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Cliente | el programa que usa la persona: una app o un navegador |
| Servidor | el ordenador que recibe peticiones y ejecuta el backend |
| Base de datos | donde se guardan los datos de forma permanente |
| Caché | una copia rápida de datos que se leen mucho |
| Cola | una lista de tareas que se harán después, por orden |
| Trabajador | un programa que va sacando tareas de la cola |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Tres piezas en casi todas las webs
Casi todas las aplicaciones web empiezan con tres piezas.
El cliente es lo que ve la persona: la app del móvil o la web en el navegador. El servidor recibe sus peticiones y decide qué hacer. La base de datos guarda pedidos, clientes y productos, aunque se apague el servidor.
El cliente nunca habla con la base de datos. Siempre pasa por el servidor.
La caché ahorra lecturas repetidas
Miles de clientes miran el precio de la leche cada hora. El precio cambia, como mucho, una vez al día.
Leerlo cada vez de la base de datos es lento y la carga mucho. La caché guarda una copia en memoria. La primera lectura va a la base de datos. Las siguientes salen de la copia.
Ejecuta el bloque y cuenta las lecturas lentas.
Practica: cuenta las lecturas
# El catálogo de un supermercado online. Leer la base de datos es lento.
database = {"leche": 95, "pan": 120, "aceite": 899}
cache = {}
slow_reads = 0
def price_of(product):
global slow_reads
if product in cache:
return cache[product] # rápido: ya lo teníamos guardado
slow_reads = slow_reads + 1
price = database[product]
cache[product] = price # lo guardamos para la próxima vez
return price
visits = ["leche", "pan", "leche", "leche", "aceite", "pan", "leche"]
for product in visits:
price_of(product)
print("Consultas a la página:", len(visits))
print("Lecturas lentas a la base de datos:", slow_reads)
# Añade cinco veces más "leche" a la lista visits y ejecuta otra vez.
# ¿Cambia el número de lecturas lentas?
Un error frecuente
Advertencia
Mucha gente cree que la caché sirve para guardar los datos importantes. Es al revés: la caché es una copia que se puede perder. El dato bueno vive en la base de datos. Usa caché solo para lo que se lee mucho y cambia poco.
La cola guarda lo que puede esperar
Al pagar, el cliente quiere saber enseguida que su pedido está hecho. El correo de confirmación y el albarán del almacén pueden tardar unos segundos.
Por eso el servidor no los hace en ese momento. Los deja en una cola y contesta ya. Un trabajador saca las tareas de la cola, por orden, y las hace.
Si el servicio de correo falla un rato, las tareas esperan en la cola sin perderse.
Ejemplo: qué pieza hace cada cosa
| Lo que pasa | Pieza | Por qué ahí |
|---|---|---|
| El cliente ve el precio del pan | Caché | se lee mucho y cambia poco |
| Se guarda el pedido pagado | Base de datos | no se puede perder |
| Sale el correo de confirmación | Cola y trabajador | puede esperar unos segundos |
| Se decide si el pago es válido | Servidor | no se fía del cliente |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.