66 votes

La philosophie du laisser-aller d'Erlang - applicable ailleurs ?

Les conseils d'Erlang (ou de Joe Armstrong ?) NE PAS utiliser la programmation défensive et laisser les processus se planter (plutôt que de polluer votre code avec des gardes inutiles essayant de garder la trace de l'épave) a tellement de sens pour moi maintenant que je me demande pourquoi j'ai gaspillé tant d'efforts sur la gestion des erreurs au fil des ans !

Ce que je me demande, c'est si cette approche ne s'applique qu'à des plateformes comme Erlang. Erlang a une VM avec un support natif simple pour les arbres de supervision de processus et le redémarrage des processus est vraiment rapide. Devrais-je consacrer mes efforts de développement (quand je ne suis pas dans le monde d'Erlang) à recréer des arbres de supervision plutôt que de m'embourber dans des gestionnaires d'exceptions de haut niveau, des codes d'erreur, des résultats nuls, etc etc etc.

Pensez-vous que ce changement d'approche fonctionnerait bien dans (disons) l'espace .NET ou Java ?

1 votes

J'ai écrit ceci il y a quelque temps : mazenharake.wordpress.com/2009/09/14/let-it-crash-the-right-way Vous pourrez peut-être y trouver quelque chose d'utile.

0 votes

Merci Mazen. C'est un bon billet ! Je comprends la philosophie que vous décrivez - ce que je me demande, c'est si le threading, les processus ou les domaines d'application de .NET (disons) sont à la hauteur de la tâche de redémarrage comme une forme de construction de contrôle... ?

0 votes

Je pense que cela peut être appliqué partout. Je suis cependant sur la corde raide ici car je ne peux pas le prouver :) Donc pour moi, c'est juste un sentiment ou une supposition, je n'ai pas essayé dans une autre langue pour savoir :)

36voto

Craig Stuntz Points 95965

Il est applicable partout . Que vous écriviez ou non votre logiciel selon le modèle "laissez-le se planter", il se plantera de toute façon, par exemple en cas de défaillance matérielle. Le modèle "Let it crash" s'applique partout où vous devez résister à la réalité. Quoth James Hamilton :

Si une panne matérielle nécessite une action administrative immédiate, le service ne pourra tout simplement pas évoluer de manière rentable et fiable. L'ensemble du service doit être capable de survivre à une panne sans interaction administrative humaine. La reprise après défaillance doit être très simple et doit être testée fréquemment. Armando Fox, de Stanford, a affirmé que la meilleure façon de tester le chemin de la défaillance n'est jamais d'arrêter le service normalement. Il suffit de le faire tomber en panne. Cela semble contre-intuitif, mais si les voies de défaillance ne sont pas fréquemment utilisées, elles ne fonctionneront pas en cas de besoin.

Cela ne signifie pas précisément "ne jamais utiliser de gardes". Mais n'ayez pas peur de vous écraser !

0 votes

MAIS : est-il assez bon marché d'utiliser l'échec dur comme construction de contrôle dans des VM autres que celle d'Erlang ?

2 votes

Dans les systèmes critiques, une solution courante consiste à mettre en place un processus "chien de garde" qui surveille l'application primaire. L'application primaire est conçue pour tomber en panne rapidement (évitant ainsi les problèmes de corruption de l'état du programme), et le chien de garde peut la redémarrer à nouveau (ou la faire basculer sur un autre système si l'on utilise une conception de sauvegarde à chaud).

3 votes

@Andrew : Je dirais que oui. J'ai utilisé fail-fast sur du code .NET et du code Win32 natif (je suis spécialisé dans la programmation d'automatisation critique pour la production). Le système de rapports d'erreurs Windows de Microsoft est conçu pour les applications fail-fast.

26voto

rvirding Points 13019

Oui, il est applicable partout, mais il est important de noter dans quel contexte il est censé être utilisé. Il ne no signifie que l'application dans son ensemble se plante, ce qui, comme l'a souligné @PeterM, peut être catastrophique dans de nombreux cas. L'objectif est de construire un système qui, dans son ensemble, ne se bloque jamais mais peut gérer les erreurs en interne. Dans notre cas, il s'agissait de systèmes de télécommunication dont les temps d'arrêt sont de l'ordre de quelques minutes par an.

La conception de base consiste à superposer le système et à isoler les parties centrales du système pour surveiller et contrôler les autres parties qui effectuent le travail. Dans la terminologie de l'ANP, nous avons superviseur y travailleur processus. Les superviseurs ont pour tâche de surveiller les travailleurs, et d'autres superviseurs, dans le but de les redémarrer correctement lorsqu'ils tombent en panne, tandis que les travailleurs effectuent tout le travail réel. Structurer correctement le système en couches en utilisant ce principe de séparation stricte des fonctionnalités vous permet d'isoler la plupart de la gestion des erreurs des travailleurs vers les superviseurs. Vous essayez de vous retrouver avec un petit un noyau d'erreur à sécurité intégrée, qui, s'il est correct, peut gérer les erreurs dans tout le reste du système. C'est dans ce contexte que la philosophie "let-it-crash" est censée être utilisée.

Vous obtenez le paradoxe suivant : vous pensez aux erreurs et aux défaillances partout dans le but de les traiter dans le moins d'endroits possible.

La meilleure approche pour traiter une erreur dépend bien sûr de l'erreur et du système. Parfois, il est préférable d'essayer d'attraper les erreurs localement au sein d'un processus et d'essayer de les traiter là, avec la possibilité d'échouer à nouveau si cela ne fonctionne pas. Si vous avez un certain nombre de processus de travail qui coopèrent, il est souvent préférable de les planter tous et de les redémarrer à nouveau. C'est un superviseur qui fait cela.

Vous avez besoin d'un langage qui génère des erreurs/exceptions lorsque quelque chose ne va pas, afin de pouvoir les piéger ou de les faire planter le processus. Ignorer les valeurs de retour des erreurs n'est pas la même chose.

0 votes

Je comprends que le lancer et le bombardement ne font pas partie de la philosophie. Ma question concerne les implications en termes de performances d'une approche "let it crash" correctement implémentée dans des systèmes AUTRES qu'Erlang ;-) Erlang semble être particulièrement adapté/conçu pour exploiter cette philosophie, alors que .NET (par exemple) ne semble pas l'être. Je suis à la recherche de contre-exemples et de cadres qui peuvent réfuter cette affirmation. Des conceptions clairement ciblées seront toujours nécessaires pour exploiter le "fast fail". Si je mets des siècles à charger tout l'état, les dépendances, etc. avant de pouvoir réessayer ou reprendre, alors ce n'est pas une option viable.

0 votes

@Andrew Matthews : Il y a (au moins) deux problèmes différents ici. Si vous voulez utiliser des processus pour la gestion des erreurs de la même manière qu'en Erlang, alors la concurrence devrait être légère comme en Erlang afin de minimiser le temps pendant lequel une partie du système ne fonctionne pas. Vous avez également le problème de la gestion de l'état, je dirais que c'est une question de conception, mais la conception sera très probablement spécifique au langage/système pour exploiter les caractéristiques du langage. Par exemple, en Erlang, un superviseur pourrait gérer une table ETS de sorte que, lorsqu'un travailleur tombe en panne, il ne soit pas nécessaire de la recharger.

0 votes

Je vois. Et parce que le superviseur gère maintenant une ressource partagée, IT doivent être supervisés ? En pratique, où coupe-t-on la régression infinie ? Je vois de toutes nouvelles perspectives de compromis à négocier ;-)

5voto

Peter M Points 4354

J'écris des programmes qui s'appuient sur des données provenant de situations réelles et s'ils tombent en panne, ils peuvent causer des dommages physiques importants (sans parler du manque à gagner). Je perdrais mon emploi en un clin d'œil si je ne programmais pas de manière défensive.

Cela dit, je pense qu'Erlang doit être un cas particulier, car non seulement vous pouvez redémarrer les choses instantanément, mais un programme redémarré peut apparaître, regarder autour de lui et dire "ahhh c'est ce que je faisais !".

0 votes

Oui - le but n'est pas de tomber définitivement en panne, mais de "vider" l'état corrompu pour le fil d'exécution en faisant échouer le processus (pas un processus au sens conventionnel, BTW, plus comme un fil léger avec des extras). Je suppose que cela nécessite sa propre forme de discipline - comme les stratégies décrites pour faire face aux exceptions en C++ par Herb Sutter...

2 votes

@Andrew Mathews - Si vous effacez l'état corrompu, et que le programme redémarre avec les mêmes entrées, ne vous préparez-vous pas à la même situation que celle qui a causé le crash en premier lieu ? Ou bien un crash est-il considéré comme un événement transitoire, et donc non répétable ?

4 votes

@Peter M : Si votre code est sans effet de bord et que vous lui fournissez la même entrée, il se plantera avec la même erreur. Les superviseurs Erlang ont des paramètres qui contrôlent combien de fois un processus défaillant sera lancé dans une période de temps donnée. Si le processus se bloque en dehors des paramètres du superviseur, le superviseur se bloquera et son superviseur en sera informé. Mais c'est toujours mieux que ce que vous obtenez dans un langage mutable. La différence en Erlang est que vous pouvez toujours faire en sorte que le processus gère les appels non défaillants, et vous pouvez corriger le bogue et le charger à chaud sans faire tomber le système.

5voto

Edwin Buck Points 33097

Cela s'appelle le fail-fast. C'est un bon paradigme à condition que vous disposiez d'une équipe de personnes capables de réagir à l'échec (et de le faire rapidement).

Dans la marine, tous les tuyaux et l'électricité sont montés à l'extérieur d'un mur (de préférence sur le côté le plus public d'un mur). De cette façon, s'il y a une fuite ou un problème, il est plus probable qu'il soit détecté rapidement. Dans la NAVY, les gens sont punis s'ils ne réagissent pas à une défaillance, donc cela fonctionne très bien : les défaillances sont détectées rapidement et on y donne suite rapidement.

Dans un scénario où quelqu'un ne peut pas agir rapidement sur une défaillance, la question est de savoir s'il est plus avantageux de laisser la défaillance arrêter le système ou d'avaler la défaillance et d'essayer de continuer.

4 votes

La marine est experte dans la manipulation des tuyaux apparemment

9 votes

Question sincère : Pourquoi les gens écrivent-ils "Navy" comme "NAVY" - Navy n'est pas un acronyme ?

0 votes

J'aurais pensé que la marine disposait de plusieurs systèmes de secours et de redondance, de sorte que si un navire est touché, il peut continuer à se battre. J'imagine également qu'un grand nombre de ces systèmes sont automatiques, comme l'arrêt des réacteurs, etc. N'est-ce pas l'équivalent d'une programmation défensive ? C'est juste une idée :-)

5voto

Mes collègues et moi-même de la pensée sur le sujet n'est pas spécialement de la technologie sage, mais plus à partir d'un domaine perspective et avec une sécurité.

La question est "Est-il sécuritaire de le laisser tomber?" ou mieux "Est-il même possible d'appliquer une robustesse paradigme comme Erlang "let it crash" liés à la sécurité du logiciel projets?".

Afin de trouver une réponse, on a fait un petit projet de recherche à l'aide d'un proche de la réalité scénario avec des industriels et surtout des antécédents médicaux. Jetez un oeil ici (http://bit.ly/Z-Blog_let-it-crash). Il y a même un papier pour le téléchargement. Dites-moi ce que vous en pensez!

Personnellement, je pense que c'est applicable dans de nombreux cas, et même souhaitable, surtout quand il y a beaucoup d'erreur de manipulation à faire (systèmes relatifs à la sécurité). Vous ne pouvez pas toujours utiliser Erlang (manque le temps réel, pas de réel intégré de soutien, costumes voeux ...), mais je suis sûr que vous pouvez mettre en œuvre dans le cas contraire (par exemple, en utilisant des fils, les exceptions, la transmission de messages). Je n'ai pas encore essayé, mais j'aimerais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X