Les horloges mentent : ce que ça casse dans votre code
Quatre mensonges de l'horloge (elle recule, elle diffère d'une machine à l'autre, elle dépend d'un fuseau, elle confond le fait et sa saisie) et pour chacun la parade, son prix et le cas où l'on peut s'en passer.
Par Elias Varen7 min de lectureMembres
$start = microtime(true);
$response = $client->request('POST', $url, $options);
$elapsedMs = (microtime(true) - $start) * 1000;Ce code peut mesurer une durée négative. Il suffit que le démon de synchronisation recale l'horloge de la machine entre les deux lignes. L'histogramme de latence reçoit −340 ms, le calcul de percentile l'avale, et le budget de timeout, calculé par soustraction, accorde à l'appel suivant plus de temps qu'il n'en restait.
C'est le plus petit des quatre mensonges. Une horloge système répond à la question « quelle heure croit-il être, ici, maintenant ? », et le code lui fait répondre à quatre autres : combien de temps s'est écoulé, lequel des deux événements est arrivé en premier, quel jour sommes-nous pour ce client, et depuis quand cette information est vraie. Chacune demande un autre outil.
Elle recule : durée et instant sont deux mesures
L'horloge murale est corrigée en permanence. La plupart du temps la correction est lissée, et parfois c'est un saut, en avant ou en arrière, après une reprise de machine virtuelle ou une longue désynchronisation. Elle sert à dater, et mal à mesurer.
Pour mesurer, le système expose une horloge monotone, sans signification absolue mais qui ne recule jamais.
$start = hrtime(true); // nanosecondes, monotone
$response = $client->request('POST', $url, $options);
$elapsedMs = (hrtime(true) - $start) / 1e6;Côté navigateur, la même distinction sépare Date.now() de performance.now(). La règle tient en une ligne : un délai, un timeout, une expiration de cache locale, un backoff se calculent sur l'horloge monotone ; seul ce qui sera lu par un humain ou une autre machine se date sur l'horloge murale.
Le coût est faible, mais il existe, car une valeur monotone ne se sérialise pas. Elle n'a de sens que dans le processus qui l'a lue. Dès qu'une échéance traverse le réseau, on repasse par l'horloge murale, et donc par le mensonge suivant.
À lire ensuite
Toute la rubrique ArchitectureArchitecture
Lire sur un replica : les bugs de lecture périmée
Les trois anomalies qu'un replica de lecture introduit dans une application qui n'en avait pas, les quatre façons de lire ses propres écritures avec leur prix, et le critère pour décider quelles lectures ont le droit de quitter le primaire.
8 minMembres
Architecture
Isolation multi-tenant : comment les fuites entre clients arrivent
Pourquoi les fuites entre clients viennent rarement de la requête SQL et presque toujours des copies de la donnée (cache, files, index de recherche, stockage objet), et où poser le tenant pour qu'un oubli ne soit plus possible.
8 minMembres
Architecture
Migrations par tenant : mille schémas ou une colonne
Ce que coûte, en exploitation, chacun des trois modèles de base multi-tenant (colonne partagée, schéma par tenant, base par tenant) le jour d'une migration, d'une restauration et d'un départ de client, et le critère pour choisir.
8 minMembres