Introduzione
In Erlang, i supervisori sono componenti fondamentali per la costruzione di sistemi resilienti e tolleranti ai guasti. Un supervisore ha il compito di monitorare i processi figli e di riavviarli in caso di errore. Questo tutorial si concentrerà sulla creazione di un supervisore personalizzato che gestisce un processo che simula un´applicazione di contatore. Impareremo a implementare un supervisore, a gestire i processi figli e a definire strategie di riavvio.
Codice completo
-module(counter_supervisor).
-behaviour(supervisor).
%% API
-export([start_link/0, init/1, start_counter/0, stop_counter/1]).
%% Inizializza il supervisore
init([]) - Spiegazione
Il codice sopra è composto da due moduli: counter_supervisor e counter. Il modulo counter_supervisor è responsabile della supervisione del modulo counter, che rappresenta un semplice contatore.
- supervisor: Questo modulo implementa il comportamento del supervisore. La funzione
init/1definisce la strategia di riavvio. In questo caso, utilizziamoone_for_one, il che significa che se un processo figlio fallisce, solo quel processo verrà riavviato. - start_link/0: Questa funzione avvia il supervisore e lo registra nel sistema.
- start_counter/0: Questa funzione avvia un nuovo processo contatore come processo figlio del supervisore.
- stop_counter/1: Questa funzione consente di fermare un processo contatore specificato dal suo PID.
Il modulo counter implementa un server gen_server che gestisce un contatore. Le funzioni principali includono:
- start_link/0: Avvia il contatore.
- init/1: Inizializza il contatore con un valore iniziale.
- handle_call/3: Gestisce le richieste per ottenere il valore del contatore.
- handle_cast/2: Gestisce i messaggi per incrementare il contatore.
- terminate/2: Gestisce la terminazione del processo.
Best practice
Quando si lavora con supervisori in Erlang, è importante seguire alcune best practice per garantire la robustezza dell´applicazione:
- Definire strategie di riavvio appropriate: Scegliere la strategia di riavvio giusta (come
one_for_one,one_for_all, etc.) in base alla logica dell´applicazione. - Limitare il numero di riavvii: Impostare un limite sul numero di riavvii per evitare cicli infiniti di crash e riavvio.
- Monitorare i processi: Utilizzare strumenti di monitoraggio per tenere traccia dello stato dei processi e identificare eventuali problemi.
- Scrivere test automatizzati: Assicurarsi che i processi e i supervisori siano ben testati per gestire correttamente gli errori.
Riepilogo
In questo tutorial abbiamo esplorato come implementare un supervisore in Erlang per gestire un processo contatore. Abbiamo visto come definire una strategia di riavvio e come interagire con i processi figli. La gestione dei processi e la tolleranza ai guasti sono aspetti cruciali nella costruzione di sistemi distribuiti e resilienti.
