CQRS : comprendre et gérer le retard des vues de lecture
Une commande validée peut manquer quelques instants dans une liste, même dans un monolithe. Voici d’où vient ce délai et comment le rendre compréhensible.
Article
Une donnée absente ou ancienne ne bloque pas tous les usages. Choisir, opération par opération, quand attendre, limiter le service ou accepter un retard.
Un client vient de s'inscrire, mais la facturation ne le trouve pas encore dans sa copie des données. Faut-il refuser la facture, attendre ou la préparer pour plus tard ? La réponse dépend du besoin métier. Une donnée en retard peut être acceptable pour un affichage et bloquante pour une décision. Il faut préciser ce que chaque opération peut faire dans cette situation.
Supposons que l'inscription enregistre le client immédiatement et qu'un traitement de fond mette ensuite à jour la copie utilisée par la facturation. Entre les deux, le client existe dans la source mais reste absent de cette copie.
Ce décalage peut survenir sans panne réseau, y compris lorsque tous les modules sont livrés ensemble. Il vient ici d'une mise à jour différée. Si le traitement s'arrête, un retard temporaire peut devenir durable.
Le théorème CAP traite plus précisément des garanties d'un système distribué face à des pertes de communication. Il ne transforme pas tout retard en partition réseau. Son interrogation sur la réponse possible avec une information incomplète aide néanmoins à poser des questions de conception similaires.
Une copie de lecture, un cache ou un service externe peut fournir une information ancienne ou indisponible. Pour concevoir le comportement de l'application, il faut savoir quelle information fait référence et comment elle arrive jusqu'au traitement qui en a besoin.
Choisir le sens d'une dépendance détermine ce que chaque module connaît. Il faut ensuite décider ce qu'il fait lorsque l'information attendue n'arrive pas.
La liste des clients peut accepter un bref décalage après une inscription. Une facture qui engage une identité ou une adresse précise peut nécessiter une vérification auprès de la source avant d'être émise. Les deux opérations utilisent pourtant les mêmes données.
Une règle qui doit rester vraie, par exemple « facturer le bon destinataire », est un invariant. Il faut identifier cette règle, puis déterminer quelles informations sont nécessaires pour la vérifier.
Je conseille de discuter aussi des erreurs que le métier accepte de corriger. Dans son retour sur CAP, Brewer cite les distributeurs de billets pour illustrer un fonctionnement qui peut privilégier le service, avec un risque financier limité et une régularisation ultérieure. C'est un exemple de compromis, pas une règle applicable à tous les paiements.
Ces trois conduites forment une grille pratique. Elles peuvent varier avec la durée de l'incident : un affichage peut utiliser une copie récente pendant quelques secondes, puis devenir indisponible si elle est trop ancienne.
| Conduite | Comportement | Exemple |
|---|---|---|
| Bloquer | Attendre ou refuser tant qu'une règle ne peut pas être vérifiée | Ne pas confirmer une action irréversible sans l'autorisation requise |
| Limiter le service | Donner une réponse utile avec une limite visible | Afficher un stock daté, sans garantir la réservation |
| Accepter le décalage | Continuer avec une mise à jour prévue plus tard | Présenter un compteur de consultations légèrement en retard |
Le délai acceptable doit être explicite. « Un peu de retard » ne permet ni de configurer une alerte ni de décider quand changer de comportement. Un objectif chiffré appartient au service concerné et doit être validé selon les conséquences pour ses utilisateurs.
Pour une facture mise en attente, indiquez qu'elle n'est pas encore émise. Pour un stock ancien, affichez la date de vérification. Pour une action refusée, expliquez si l'utilisateur peut réessayer ou s'il doit choisir une autre démarche.
Un tableau par opération aide à rendre ces choix vérifiables :
Cette méthode dépasse le champ strict de CAP. Kleppmann et Abadi invitent justement à éviter les classifications trop larges. Un retard prévu, une erreur de traitement et une coupure réseau peuvent gêner la même opération, mais ils ne se diagnostiquent ni ne se réparent de la même façon.
Explorer
Choisis dans l’index d’après les étiquettes de cet article — les plus proches d’abord, hors de sa série. Rien n’est écrit à la main : un article publié demain avec les mêmes étiquettes y prendra place.
Une commande validée peut manquer quelques instants dans une liste, même dans un monolithe. Voici d’où vient ce délai et comment le rendre compréhensible.
Dans un monolithe, un traitement différé peut laisser deux modules en décalage. Quand faut-il attendre une réponse et comment gérer une mise à jour tardive ?
Une commande expédiée met à jour une liste et déclenche un courriel. Ces effets ne se réparent pas de la même façon : voici comment organiser leur reprise.
Laisser un commentaire
Votre commentaire sera relu avant d'être publié.