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
| Palabra | Qué significa |
|---|---|
| Consistencia fuerte | toda lectura ve la última escritura |
| Consistencia eventual | las copias acaban iguales si no hay escrituras nuevas |
| Lectura obsoleta | una lectura que devuelve un dato ya cambiado |
| Partición de red | un corte que deja a los nodos sin hablarse |
| Compromiso | ganar 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
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
v SET saldo:ana 100Se 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
v GET saldo:anaSe 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
v WAIT 1 100Se 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
| Segundo | Qué ocurre | Lee del primario | Lee de la réplica |
|---|---|---|---|
| 1 | Se escribe saldo = 100 | 100 | sin dato |
| 2 | Alguien lee | 100 | sin dato |
| 3 | La réplica recibe el cambio | 100 | 100 |
| 4 | Se escribe saldo = 80 | 80 | 100 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuándo ve el cambio la réplica
# 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
# 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.