Domanda

(o di? Joe Armstrong) il consiglio di Erlang NON usare la programmazione difensiva e di lasciare incidente processi (invece di inquinare il codice con guardie inutile cercare di tenere traccia della relitto) rende molto senso per me ora che mi chiedo perché ho sprecato così tanto sforzo da gestione degli errori nel corso degli anni!

Quello che mi chiedo è - è questo approccio solo applicabile alle piattaforme come Erlang? Erlang è una macchina virtuale con un semplice supporto nativo per gli alberi di supervisione dei processi e riavviare processi è davvero veloce. Dovrei spendere i miei sforzi di sviluppo (se non nel mondo Erlang) di ricreare alberi di supervisione piuttosto che bogging me stesso verso il basso con i gestori delle eccezioni di livello superiore, i codici di errore, risultati nulli ecc ecc ecc.

Pensi che questo cambiamento di approccio dovrebbe funzionare bene a (diciamo) lo spazio .NET o Java?

È stato utile?

Soluzione

E ' applicabile ovunque . O se non si scrivere il software in un modello "lasciarlo crash", andrà in crash in ogni caso, per esempio, quando l'hardware fallisce. "Let it in crash" si applica ovunque in cui è necessario per sopportare la realtà. Disse James Hamilton:

  

Se un guasto hardware richiede alcuna azione amministrativa immediata, il servizio semplicemente non scala conveniente e affidabile. Il servizio intera deve essere in grado di sopravvivere senza l'interazione fallimento amministrativo umana. recupero fallimento deve essere un percorso molto semplice e che percorso deve essere testato frequentemente. Armando Fox di Stanford ha sostenuto che il modo migliore per testare il percorso di fallimento non è mai di chiudere il servizio normale. Basta hard-fail esso. Questo suoni contro-intuitivo, ma se non vengono utilizzati di frequente i percorsi di rottura, non funzionerà in caso di necessità.

Questo non fa esattamente media "mai guardie uso", però. Ma non abbiate paura di crash!

Altri suggerimenti

Sì, è applicabile ovunque, ma è importante notare in quale contesto è pensato per essere utilizzato. Lo fa non significa che l'applicazione nel suo complesso crash che, come @PeterM sottolineato, può essere catastrofici, in molti casi. L'obiettivo è quello di costruire un sistema che nel suo complesso non si blocca, ma in grado di gestire gli errori internamente. Nel nostro caso si trattava di sistemi Telecomms che si prevede di avere i tempi di fermo in ordine di minuti all'anno.

Il progetto di base è quello di sovrapporre il sistema e isolare le parti centrali del sistema per monitorare e controllare le altre parti che fanno il lavoro. In OTP terminologia abbiamo supervisore e lavoratore processi. Le autorità di vigilanza hanno il compito di monitorare i lavoratori, e le altre autorità di vigilanza, con l'obiettivo di loro riavviare nel modo corretto quando si infrangono mentre gli operai fanno tutto il lavoro vero e proprio. Strutturazione del sistema correttamente in livelli utilizzando questo principio di separazione rigorosamente la funzionalità permette di isolare la maggior parte del trattamento degli errori fuori dei lavoratori nei supervisori. Si tenta di finire con un piccolo kernel fail-safe errore, che se gli errori in grado di gestire correttamente in tutto il resto del sistema. E 'in questo contesto in cui la filosofia "let-it-crash" è pensato per essere utilizzato.

Si ottiene il paradosso di cui si sta pensando di errori e fallimenti in tutto il mondo con l'obiettivo di gestire effettivamente nel minor numero di posti possibile.

L'approccio migliore per gestire un errore dipende naturalmente l'errore e il sistema. A volte è meglio per cercare di errori di cattura a livello locale all'interno di un processo e cercando di gestirli lì, con la possibilità di fallire ancora una volta, se questo non funziona. Se si dispone di un certo numero di processi di lavoro cooperanti allora è spesso meglio in crash tutti e riavviare di nuovo. E 'un supervisore che fa questo.

Si ha bisogno di un linguaggio che genera errori / eccezioni quando qualcosa va storto in modo da poter loro trappola o li hanno in crash il processo. Basta ignorando i valori di ritorno di errore non è la stessa cosa.

Si chiama fail-fast. E 'un buon paradigma a patto di avere un team di persone che possono rispondere al fallimento (e fare così in fretta).

Nel NAVY tutte le tubazioni ed è elettrico montato sulla superficie esterna di una parete (preferibilmente sul lato più pubblica di un muro). In questo modo, se c'è una perdita o un problema, è più probabile da rilevare rapidamente. In the Navy, le persone vengono puniti per non rispondere ad un fallimento, in modo che funziona molto bene: i guasti vengono rilevati in modo rapido ed agire di conseguenza in modo rapido

.

In uno scenario in cui qualcuno non può agire su un fallimento rapidamente, diventa una questione di opinione se sia più vantaggioso per consentire il fallimento per arrestare il sistema o di ingoiare il fallimento e tentare di continuare in avanti.

Scrivo programmi che si basano su dati provenienti da situazioni del mondo reale e se si infrangono possono causare grandi $$ a danni fisici (per non parlare di grande $$ in mancati introiti). Sarei fuori di un lavoro in un lampo se non programmo difensiva.

Detto questo penso che Erlang deve essere un caso speciale che non solo è possibile riavviare le cose immediatamente, che un programma riavviato può pop-up, guardarsi intorno e dire "ahhh .. che era quello che stavo facendo!"

I miei colleghi ed io ci pensò l'argomento non particolarmente tecnologia saggio, ma più da un punto di vista di dominio e con particolare attenzione la sicurezza.

La domanda è: "E 'sicuro di lasciarlo in crash?" o meglio "E 'anche possibile applicare un paradigma robustezza come Erlang di‘lasciarlo in crash’per progetti di software riguardanti la sicurezza?".

Al fine di trovare una risposta che abbiamo fatto un piccolo progetto di ricerca utilizzando una realtà prossimo al scenario con sfondo industriale e soprattutto dalla medicina. Date un'occhiata qui ( http://bit.ly/Z-Blog_let-it-crash). C'è anche un documento per il download. Ditemi cosa ne pensate!

Personalmente penso che sia applicabile in molti casi, e anche auspicabile, soprattutto quando c'è un sacco di gestire da fare (sistemi riguardanti la sicurezza) di errore. Non si può sempre uso Erlang (mancano le caratteristiche in tempo reale, supporto reale incorporato, whishes costumer ...), ma sono abbastanza sicuro che è possibile implementare altrimenti (per esempio tramite discussioni, eccezioni, di messaggi). Non ho ancora provato, però, ma mi piacerebbe.

IMHO Alcuni sviluppatori maniglia / involucro eccezioni controllate con il codice che aggiungono poco valore. Spesso è più semplice per consentire a un metodo per generare l'eccezione originale a meno che si sta per gestire e aggiungere qualche valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top