Que voit-on juste après une écriture ?
La cohérence dit ce qu’un lecteur voit juste après une écriture, quand une donnée existe en plusieurs copies. Elle décide si tout le monde lit tout de suite la nouvelle valeur, ou si certains lisent encore l’ancienne.
Inès paie 20 € et son solde passe de 100 € à 80 €. Si elle ouvre l’application sur une copie en retard, elle voit encore 100 €.
À la fin de cette leçon
Remarque
Je peux dire ce qu’un lecteur voit après une écriture et quel compromis cela coûte.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Cohérence forte | tout lecteur voit la dernière écriture terminée |
| Cohérence à terme | les copies finissent par être égales, pas tout de suite |
| Lecture périmée | une lecture qui rend une ancienne valeur |
| Délai de propagation | le temps qu’une écriture met à atteindre une copie |
| Compromis | un gain d’un côté qui coûte quelque chose de l’autre |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La cohérence forte : toujours la dernière valeur
Avec la cohérence forte, une lecture qui commence après la fin d’une écriture voit cette écriture, quelle que soit la copie interrogée. Le système se comporte comme s’il n’y avait qu’une copie.
Pour y arriver, une écriture n’est terminée que lorsque les copies concernées l’ont reçue. Cela prend du temps, et cela échoue si une copie ne répond pas.
Fabriquer un petit client nommé v
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le solde d’Inès
v SET dist:solde:ines 100Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le relire
v GET dist:solde:inesAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le solde après le paiement
v SET dist:solde:ines 80Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Relire : l’ancienne valeur a disparu
v GET dist:solde:inesAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La cohérence à terme : les copies se rattrapent
Avec la cohérence à terme, une écriture est confirmée dès que le primaire l’a reçue. Les autres copies la reçoivent après un délai de propagation. Si plus rien n’est écrit, toutes finissent par être égales.
Entre-temps, une lecture sur une copie en retard est une lecture périmée.
Exemple : les lectures d’Inès au fil du temps
| Instant | Primaire | Réplique (2 s de retard) | Lecture sur la réplique |
|---|---|---|---|
| 0 s : solde de départ | 100 | rien encore | rien |
| 4 s | 100 | 100 | à jour |
| 5 s : paiement de 20 € | 80 | 100 | périmée |
| 7 s | 80 | 80 | à jour |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Rejouer des écritures et des lectures
# Le primaire reçoit deux écritures. La réplique les voit 2 secondes plus tard.
ecritures = [[0, 100], [5, 80]]
delai = 2
for instant in [1, 4, 6, 7, 8]:
primaire = None
replique = None
for ecriture in ecritures:
if ecriture[0] <= instant:
primaire = ecriture[1]
if ecriture[0] + delai <= instant:
replique = ecriture[1]
print("t =", instant, "primaire", primaire, "réplique", replique)
# Passez le délai à 0 : les deux colonnes sont toujours égales.
Le choix dépend de ce qu’une erreur coûte
On ne peut pas avoir à la fois l’attente la plus courte et la valeur toujours à jour. Il faut choisir selon l’usage.
Un solde bancaire ou le dernier billet d’un concert demandent la cohérence forte : une valeur périmée coûte de l’argent. Un compteur de mentions « j’aime » peut attendre quelques secondes sans dommage.
Une erreur fréquente
Attention
On croit souvent que « à terme » veut dire « parfois faux pour toujours ». Ce n’est pas le cas : sans nouvelle écriture, les copies deviennent égales. Le risque est une lecture périmée pendant le délai, pas une valeur fausse définitive.