Question

Erlang (ou de? Joe Armstrong) conseil ne pas utiliser la programmation défensive et de laisser les processus accident (plutôt que de polluer votre code avec des gardes inutiles en essayant de garder une trace de la épave) fait tellement de sens pour moi maintenant que je me demande pourquoi j'ai perdu tant d'efforts sur la gestion des erreurs au fil des ans!

Qu'est-ce que je me demande est - cette approche est uniquement applicable aux plates-formes comme Erlang? Erlang a une machine virtuelle avec simple support natif pour les arbres de supervision des processus et le redémarrage des processus est vraiment rapide. Dois-je passer mes efforts de développement (lorsqu'ils ne sont pas dans le monde Erlang) sur moi-même plutôt que de recréer des arbres de surveillance embourber avec des gestionnaires d'exception au niveau supérieur, les codes d'erreur, les résultats nuls, etc etc etc.

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

Était-ce utile?

La solution

Il est applicable partout . Si oui ou non vous écrivez votre logiciel dans un « laissez-crash » modèle, il va se planter de toute façon, par exemple, lorsque le matériel tombe en panne. « Laissez-le plantage » applique partout où vous avez besoin pour résister à la réalité. Quoth James Hamilton:

  

Si une défaillance matérielle nécessite une action administrative immédiate, le service ne sera pas simplement l'échelle rentable et fiable. Le service entier doit être capable de survivre non sans interaction humaine administrative. récupération de défaillance doit être un chemin très simple et ce chemin doit être testé fréquemment. Armando Fox de Stanford a fait valoir que la meilleure façon de tester le chemin d'échec est de ne jamais fermer le service normalement. Juste dur l'échouer. Cela semble contre-intuitif, mais si les chemins d'échec ne sont pas fréquemment utilisés, ils ne fonctionneront pas en cas de besoin.

Cela ne signifie pas précisément dire « jamais gardes d'utilisation, » cependant. Mais ne pas avoir peur de tomber en panne!

Autres conseils

Oui, il est applicable partout, mais il est important de noter dans quel contexte il est destiné à être utilisé. Finalité pas signifient que l'application en tant que plante entière qui, comme @PeterM a souligné, peut être catastrophique dans de nombreux cas. L'objectif est de construire un système qui se bloque dans son ensemble, mais ne peut gérer en interne les erreurs. Dans notre cas, il était systèmes de Telecomms qui devraient avoir dans l'ordre des arrêts de minutes par an.

La conception de base est à la couche système et isoler les parties centrales du système pour surveiller et contrôler les autres parties qui font le travail. Dans OTP terminologie que nous avons superviseur et travailleur processus. Les superviseurs ont la tâche de surveiller les travailleurs, et d'autres superviseurs, dans le but de les redémarrer de manière correcte quand ils s'écrasent alors que les travailleurs font tout le travail réel. Structurer le système correctement en couches utilisant ce principe de séparation strictement la fonctionnalité vous permet d'isoler plus de l'erreur de manipulation sur des travailleurs dans les superviseurs. Vous essayez de finir avec un petit fail-safe noyau d'erreur qui, si les erreurs de poignée correcte peut partout dans le reste du système. Il est dans ce contexte où est destiné à être utilisé la philosophie « let-it-crash ».

Vous obtenez le paradoxe de l'endroit où vous pensez à des erreurs et des échecs partout dans le but de les manipuler en fait en aussi peu d'endroits que possible.

La meilleure approche pour gérer une erreur dépend bien sûr de l'erreur et le système. Parfois, il est préférable d'essayer des erreurs de prises localement dans un processus et d'essayer de les traiter là-bas, avec l'option de ne pas à nouveau si cela ne fonctionne pas. Si vous avez un certain nombre de processus de travail qui coopèrent alors il est souvent préférable de les planter tous et les remettre en marche à nouveau. Il est un superviseur qui fait cela.

Vous avez besoin d'un langage qui génère des erreurs / exceptions en cas de problème afin que vous puissiez les piéger ou faire planter le processus. Juste en ignorant les valeurs de retour d'erreur n'est pas la même chose.

Il est appelé échec rapide. Il est un bon paradigme à condition que vous avez une équipe de personnes qui peuvent répondre à l'échec (et le faire rapidement).

dans la marine tous les tuyaux et est électrique monté sur l'extérieur d'une paroi (de préférence sur le côté le plus commun d'un mur). De cette façon, s'il y a une fuite ou un problème, il est plus susceptible d'être détectée rapidement. Dans la marine, les gens sont punis pour ne pas répondre à un échec, il fonctionne très bien: des défaillances sont détectées rapidement et ont agi rapidement sur

.

Dans un scénario où une personne ne peut pas agir sur un échec rapidement, il devient une question d'opinion s'il est plus avantageux pour permettre l'échec d'arrêter le système ou à avaler l'échec et tenter de continuer en avant.

J'écris des programmes qui reposent sur des données provenant des situations réelles et si elles plantent ils peuvent causer de gros dégâts physiques en $$ (sans parler de grande $$ des pertes de revenus). Je serais d'un emploi dans un flash si je ne l'ai pas défensivement programme.

Cela dit, je pense que Erlang doit être un cas particulier qui peut vous redémarrer non seulement les choses instantanément, qu'un programme redémarré peut apparaître, regarder autour et dire « ahhh .. c'était ce que je faisais! »

Mes collègues et moi-même pensé à ce sujet pas particulièrement sage technologie, mais plus dans une perspective de domaine et en mettant l'accent sur la sécurité.

La question est « Est-il sûr de le laisser planter? » ou mieux « Est-il même possible d'appliquer un modèle de robustesse comme Erlang de « laisser crash » à des projets logiciels relatifs à la sécurité? ».

Pour trouver une réponse que nous avons fait un petit projet de recherche à l'aide d'un proche à la réalité scénario avec un fond industriel et notamment en matière médicale. Jetez un coup d'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 pensez!

Personnellement, je pense qu'il est applicable dans de nombreux cas, et même souhaitable, surtout quand il y a beaucoup de traitement des erreurs à faire (systèmes relatifs à la sécurité). Vous ne pouvez pas toujours l'utilisation Erlang (éléments manquants en temps réel, une assistance réel embarqué, Whishes costumier ...), mais je suis sûr que vous pouvez le mettre en œuvre autrement (par exemple en utilisant des fils, exceptions, le passage de messages). Je ne l'ai pas encore essayé bien, mais je voudrais.

à mon humble avis Certains gestionaires développeurs / wrap vérifiés exceptions avec le code qui ajoutent peu de valeur. Il est souvent plus simple de permettre une méthode de jeter l'exception d'origine à moins que vous allez gérer et ajouter une certaine valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top