¿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

Consistencia fuerte y consistencia eventual

Después de esta lección: Puedo decir qué ve un lector tras una escritura con consistencia fuerte y con consistencia eventual.

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

Dos pantallas, dos saldos distintos

La consistencia dice qué dato ve quien lee justo después de una escritura. Si ingresas dinero y lo miras desde otro dispositivo, esperas ver el saldo nuevo.

En un sistema con varias copias no siempre ocurre. Entender cuándo se ve el dato nuevo y cuánto cuesta garantizarlo te ayuda a elegir bien cómo guardar cada dato.

Al final de esta lección

Nota

Puedo decir qué ve un lector tras una escritura con consistencia fuerte y con consistencia eventual.

Palabras clave

PalabraQué significa
Consistencia fuertetoda lectura ve la última escritura
Consistencia eventuallas copias acaban iguales si no hay escrituras nuevas
Lectura obsoletauna lectura que devuelve un dato ya cambiado
Partición de redun corte que deja a los nodos sin hablarse
Compromisoganar algo a cambio de renunciar a otra cosa

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

Con consistencia fuerte siempre se lee lo último

Con consistencia fuerte, cuando una escritura termina, todas las lecturas posteriores ven ese dato, lean de donde lean.

Para conseguirlo, el sistema espera a que las copias se pongan al día antes de decir «hecho», o lee siempre del primario. Es lo más fácil de entender, pero cada escritura tarda más.

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.

Escribir un saldo

Comando
v SET saldo:ana 100

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

Leerlo justo después

Comando
v GET saldo:ana

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

Pedir que una réplica confirme en 100 ms

Comando
v WAIT 1 100

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

Con consistencia eventual las copias acaban iguales

Con consistencia eventual, el primario responde «hecho» enseguida y las réplicas se ponen al día después. Si no llegan escrituras nuevas, todas acaban con el mismo dato.

Mientras tanto, una lectura puede ser obsoleta. Es una buena opción para un contador de «me gusta»: nadie se perjudica por verlo un segundo tarde.

Ejemplo: quién ve qué tras 2 segundos

SegundoQué ocurreLee del primarioLee de la réplica
1Se escribe saldo = 100100sin dato
2Alguien lee100sin dato
3La réplica recibe el cambio100100
4Se escribe saldo = 8080100

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

Cuándo ve el cambio la réplica

Código: python
# Una escritura en el segundo 1 llega a la réplica 2 segundos después.
retraso = 2
escritura = 1
for segundo in [1, 2, 3, 4]:
    if segundo >= escritura + retraso:
        print("segundo", segundo, ": la réplica ya muestra el cambio")
    else:
        print("segundo", segundo, ": la réplica aún muestra el dato viejo")
# Cambia el retraso a 0 y vuelve a ejecutar.

Un error muy común

Advertencia

Mucha gente cree que «eventual» significa que los datos pueden quedar mal para siempre. No es así. Las copias convergen en cuanto dejan de llegar escrituras y la red las comunica. Lo único que se acepta es un retraso, no una pérdida.

Si la red se corta hay que elegir

A veces la red entre dos nodos se corta: es una partición de red. Una réplica aislada tiene dos opciones.

Puede responder con lo que tiene, que es rápido pero quizá obsoleto. O puede negarse a responder, que es correcto pero corta el servicio. Es un compromiso: no se tienen las dos cosas a la vez.

Responder o negarse

Código: python
# La red entre el primario y la réplica se corta. Una lectura llega a la réplica.
red_cortada = True
politica = "responder"
if red_cortada:
    if politica == "responder":
        print("Responde con lo que tiene: rápido, pero quizá obsoleto")
    else:
        print("Se niega a responder: correcto, pero el servicio se corta")
# Cambia la política a "negarse" y vuelve a ejecutar.

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.