2009-07-19 14 views
8

La tolleranza ai guasti di Erlang (a quanto ho capito) include l'uso dei processi di supervisione per tenere d'occhio i processi di lavoro, quindi se un lavoratore muore, il supervisore può avviarne uno nuovo.In che modo i processi di supervisione controllano i processi? Lo stesso può essere fatto sulla JVM?

In che modo Erlang esegue questo monitoraggio, soprattutto in uno scenario distribuito? Come può essere sicuro che il processo sia veramente morto? Fa battiti del cuore? C'è qualcosa di costruito nell'ambiente di runtime? Cosa succede se un cavo di rete è scollegato? Si presume che gli altri processi siano morti se non è in grado di comunicare con loro? ecc.

Stavo pensando a come ottenere la stessa tolleranza ai guasti ecc. rivendicata da Erlang nella JVM (in Java o Scala). Ma non ero sicuro di aver bisogno del supporto integrato nella JVM per farlo, così come Erlang. Non avevo ancora trovato una definizione di come Erlang lo fa ancora come un punto di confronto.

risposta

5

L'Erlang OTP Supervisione in genere non viene eseguita tra processi su nodi diversi. Funzionerebbe, ma la migliore pratica è di farlo in modo diverso.

L'approccio comune è scrivere l'intera applicazione in modo che venga eseguita su ciascuna macchina, ma l'applicazione è consapevole del fatto che non è sola. E una parte dell'applicazione ha un monitor di nodo, quindi è a conoscenza dei nodi-down (questo viene fatto con un semplice ping di rete). Questi nodi giù possono essere utilizzati per modificare le regole di bilanciamento del carico o ricadere su un altro master, ecc.

Questo ping indica che è presente una latenza nel rilevamento dei down del nodo. Possono essere necessari alcuni secondi per rilevare un nodo peer morto (o un collegamento morto ad esso).

Se il supervisore e il processo vengono eseguiti localmente, il crash e il segnale al supervisore sono praticamente istantanei. Si basa su una funzionalità che un crash anormale si propaga a processi collegati che si bloccano anche se non intercettano le uscite.

+0

Grazie, ha molto senso. Sembra una cosa comune che l'invio di messaggi tra macchine sia diverso dall'invio tra processi locali (maggiori costi generali, più motivi per cui può fallire, ecc.). Quindi codifica la tua applicazione per sapere su questo (non c'è un proiettile d'argento per rendere le chiamate locali/remote lo stesso, quindi non provare). Ciò significa che un modello simile nella JVM è certamente possibile. Supervisiona solo processi/thread/fibre/attori/qualsiasi cosa locali e codice nel ping dell'applicazione di altri nodi (e cosa fare se non puoi raggiungerne uno). –

0

Sembra che qualcuno abbia implementato uno similar strategy in Scala. La mia aspettativa sarebbe che un supervisore trattasse un errore di rete come un sottoprocesso fallito, e la documentazione sul processo di Scala sembra confermarlo.

+0

Grazie - è stato un post interessante. Ho lasciato un messaggio lì cercando di capire se supportava le connessioni di rete. Ho avuto la sensazione (forse errata) che stia guardando qualcos'altro all'interno della JVM e che non abbia a che fare con problemi ai confini del processo incrociato. Ma se tutto funziona, sarebbe fantastico! –

0

Penso che intendiate per processo di supervisione il portmapper. È possibile utilizzare il portmapper/infrastruttura Erlang tramite lo JInterface - in questo modo si evita di reinventare la rotella - nel caso in cui lo si voglia comunque si ottengono almeno tutte le interfacce descritte in quel punto.

+0

Grazie, ma speravo di avere solo la macchina virtuale Java in giro (nessuna macchina virtuale di Erlang). Mantiene le cose più semplici (politicamente). –

-1

Erlang è opensource, il che significa che è possibile download the source e ottenere la risposta definitiva su come Erlang lo fa.

In che modo Erlang esegue questo monitoraggio, in particolare in uno scenario distribuito? Come può essere sicuro che il processo sia veramente morto? Fa battiti del cuore? C'è qualcosa di costruito nell'ambiente di runtime?

Credo che sia stato eseguito nel runtime di BEAM. Quando un processo muore, un segnale viene inviato a tutti i processi ad esso collegati. Vedi il capitolo 9 di Programming Erlang per una discussione completa.

Cosa succede se un cavo di rete è scollegato? Si presume che gli altri processi siano morti se non può comunicare con loro? ecc

in Erlang, è possibile scegliere di monitorare un nodo, e ricevere {node_up, Node} e {node_down, Node} messaggi.Presumo che verranno inviati anche se non puoi più parlare con un nodo. Come li gestisci dipende da te.

Problemi correlati