ejabberd è una delle applicazioni erlang più conosciute e quella con cui ho imparato erlang.
Penso che sia uno dei progetti più interessanti per l'apprendimento di Erlang perché si sta davvero basando sulla forza di Erlang. (Tuttavia alcuni sosterranno che non è OTP, ma non preoccuparti che ci sia ancora un sacco di ottimo codice all'interno ...)
Perché ?
Un server XMPP (come ejabberd) può essere visto come un router di alto livello, instradando i messaggi tra gli utenti finali. Naturalmente ci sono altre funzionalità, ma questo è l'aspetto più importante di un server di messaggistica istantanea. Deve instradare molti messaggi contemporaneamente e gestire molte connessioni TCP / IP.
Quindi abbiamo 2 caratteristiche:
- gestire molte connessioni
- instradare i messaggi dati alcuni aspetti del messaggio
Questi sono esempi in cui brilla erlang.
gestire molte connessioni
È molto semplice creare server TCP / IP scalabili non bloccanti con erlang. In effetti, è stato progettato per risolvere questo problema. E dato che può generare centinaia di migliaia di processi (e non thread , è un approccio share-nothing, che è più semplice da progettare), ejabberd è progettato come un insieme di processi erlang (che possono essere distribuiti su più server):
- processo di connessione client
- processo del router
- processo di chatroom
- processi da server a server
Tutti si scambiano messaggi.
instradare i messaggi dati alcuni aspetti del messaggio
Un'altra caratteristica molto adorabile di erlang è la corrispondenza dei motivi . È usato in tutta la lingua.
Ad esempio, di seguito:
access(moderator, _Config)-> rw;
access(participant, _Config)-> rw;
access(visitor, #config{type="public"})-> r;
access(visitor, #config{type="public_rw"})-> rw;
access(_User,_Config)-> none.
Sono 5 diverse versioni della access
funzione. Erlang selezionerà la versione più appropriata alla luce degli argomenti ricevuti. ( Config
è una struttura di tipo #config
che ha un type
attributo).
Ciò significa che è molto semplice e molto più chiaro del concatenamento if/else
o switch/case
della creazione di regole aziendali.
Per concludere
Scrivere server scalabili, questo è il punto centrale di Erlang. Tutto è progettato per renderlo facile. Alle due funzionalità precedenti, aggiungerei:
- aggiornamento del codice a caldo
mnesia
, database relazionale distribuito (incluso nella distribuzione di base)
mochiweb
, su cui sono basati la maggior parte dei server erlang http
- supporto binario (decodifica e codifica del protocollo binario facile come sempre)
- una grande comunità con grandi progetti open source (
ejabberd
, couchdb
ma anche webmachine
, riak
e una serie di librerie molto facili da incorporare)
Meno LOC
C'è anche questo articolo di Richard Jones. Ha riscritto un'applicazione da C ++ a erlang: 75% in meno di righe in erlang.