¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Qué es un sistema distribuido

Después de esta lección: Puedo explicar por qué un sistema se reparte entre varias máquinas y qué problemas trae.

Lección de 50 min4 comandosLaboratorio de Valkey: aprende un almacén clave-valor compatible con Redis, con expiración y listas

Una tienda en rebajas se cae

Un sistema distribuido es un conjunto de ordenadores que trabajan juntos y se presentan al usuario como uno solo. Lo usan la banca, las tiendas en línea y las redes sociales.

Sirve para atender a más gente, responder más cerca de cada persona y seguir en marcha cuando una máquina falla. A cambio aparecen problemas nuevos, y esta lección los nombra.

Al final de esta lección

Nota

Puedo explicar por qué un sistema se reparte entre varias máquinas y qué problemas trae.

Palabras clave

PalabraQué significa
Nodouna máquina que forma parte de un sistema
Sistema distribuidovarios nodos que cooperan por la red
Latenciael tiempo que tarda una respuesta en llegar
Fallo parcialuna parte del sistema falla y el resto sigue
Disponibilidadla parte del tiempo en que el servicio responde
Escalarpoder atender más trabajo añadiendo recursos

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un solo servidor tiene un límite

Un servidor aguanta un número fijo de pedidos por minuto. Si llegan más, las respuestas se retrasan o se pierden.

Hay dos salidas. Comprar un servidor más grande tiene techo y cuesta mucho. Añadir más servidores iguales reparte el trabajo y permite escalar. La segunda salida es la que usan los sistemas distribuidos.

Ejemplo: cuántos servidores hacen falta

MomentoPedidos por minutoUn servidor aguantaServidores necesarios
Un martes cualquiera4006001
Víspera de las rebajas1.2006002
Primera hora de las rebajas3.0006005

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Fabricar un cliente pequeño llamado v

Comando
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Preguntar a otro nodo si está vivo

Comando
v PING

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Guardar un dato en ese nodo

Comando
v SET stock:lampara 25

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pedir el dato por la red

Comando
v GET stock:lampara

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

La latencia suma las esperas en fila

Cada llamada por la red tarda un poco. Ese tiempo es la latencia, y se mide en milisegundos.

Si una página necesita cuatro servicios y los llama uno detrás de otro, las esperas se suman. Si los llama a la vez, la página espera solo al más lento. Repartir el trabajo ayuda, pero cada salto por la red añade tiempo.

Sumar esperas o esperar al más lento

Código: python
# Una página llama a cuatro servicios. Tiempos en milisegundos.
llamadas = [["catalogo", 20], ["precios", 35], ["stock", 15], ["opiniones", 50]]
en_fila = 0
mayor = 0
for llamada in llamadas:
    en_fila = en_fila + llamada[1]
    if llamada[1] > mayor:
        mayor = llamada[1]
print("Una detrás de otra:", en_fila, "ms")
print("Todas a la vez:", mayor, "ms")
# Cambia 50 por 200 y vuelve a ejecutar: ¿qué servicio manda ahora?

Un fallo parcial deja el sistema a medias

En un solo ordenador, o todo funciona o todo se apaga. En un sistema distribuido una máquina puede caer mientras las demás siguen. Eso es un fallo parcial.

Con varias copias de un servicio, el sistema aguanta la caída de una. La disponibilidad mide cuánto tiempo responde. Se acerca a 1 cuando hay copias de reserva.

Contar copias que siguen vivas

Código: python
# Tres copias de un servicio. Cada una funciona (True) o ha caído (False).
copias = {"madrid": True, "valencia": False, "sevilla": True}
activas = 0
for nombre in copias:
    if copias[nombre]:
        activas = activas + 1
print("Copias activas:", activas, "de", len(copias))
if activas >= 1:
    print("El servicio responde, aunque una parte ha caído.")
else:
    print("El servicio no responde.")
# Pon False en sevilla y en madrid, y vuelve a ejecutar.

Un error muy común

Advertencia

Mucha gente cree que si un nodo no contesta, ha caído. Puede estar solo lento, o la red entre vosotros puede estar cortada. Desde fuera no se puede distinguir. Por eso se fija un tiempo de espera y se decide qué hacer cuando se agota.

Más lejos: la cadena y la reserva

Una compra pasa por tres piezas seguidas: la web, el pago y el almacén. Si cada una funciona el 90 % del tiempo, la compra funciona solo el 72,9 % (0,9 por 0,9 por 0,9).

Ahora duplica el pago, de modo que basten una de sus dos copias. Calcula la disponibilidad nueva de la cadena y comprueba que sube.

Sobre este laboratorio y su código: Laboratorio de Valkey: aprende un almacén clave-valor compatible con Redis, con expiración y listas

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.