Aller au contenu
Sylvain Joffraud l4w
Retour

State machine : fail-open vs fail-closed selon la criticité

Pattern qui revient sur n’importe quel système qui prend des décisions sur des mesures bruitées : capteurs IoT, GPS, télémétrie, monitoring d’un service distant. Tu as une state machine simple (ex : inside_zoneoutside_zone) et tu veux décider quand transitionner sur la base de mesures qui parfois mentent.

Le piège du gating symétrique

La tentation : « si la mesure est de qualité douteuse, on ignore la transition ». Symétrique, propre.

if (isReliableFix(measurement)) {
  if (currentState === A && shouldGoToB(measurement)) transition(AB);
  if (currentState === B && shouldGoToA(measurement)) transition(BA);
}

Problème : si le système entre dans un mode où il rapporte systématiquement des mesures dégradées (capteur en veille, GPS en mode économie, service distant down qui retourne unknown), tu te retrouves coincé dans un état que tu ne peux plus quitter.

Cas concret vécu : un tracker GPS qui en mode économie envoie des positions sans sat → fail-closed strict bloque les deux transitions → si le device est sorti puis rentré et reste immobile, l’épisode « sorti » ne se ferme jamais.

La bonne approche : asymétrie selon la criticité

Examiner pour chaque transition :

Pour le cas géofence :

// fail-OPEN, lax : ferme l'épisode même sur fix douteux
if (state === outside && shouldBeInside(m) && isPlausibleInsideFix(m))
  transition(outsideinside);

// fail-CLOSED, strict : ouvre l'épisode seulement sur fix fiable
if (state === inside && shouldBeOutside(m) && isReliableFix(m))
  transition(insideoutside);

Généralisation

Le pattern s’applique à plein de cas :

Le bon raisonnement n’est pas « fail-closed parce que safe ». C’est fail vers l’état le moins coûteux en cas d’erreur.

Lessons learned

#state-machine #patterns #robustness #design #monitoring #alerting #iot


Partager cet article :

Article précédent
Wake Lock API : relâché en arrière-plan, à ré-acquérir
Article suivant
Wording UX : erreurs inline par champ sur des uploads