ejabberd est l'une des applications erlang les plus connues et celle avec laquelle j'ai appris erlang.
Je pense que c'est l'un des projets les plus intéressants pour apprendre l'erlang car il s'appuie vraiment sur la force d'erlang. (Cependant, certains diront que ce n'est pas OTP, mais ne vous inquiétez pas, il y a encore une mine de code à l'intérieur ...)
Pourquoi ?
Un serveur XMPP (comme ejabberd) peut être considéré comme un routeur de haut niveau, acheminant les messages entre les utilisateurs finaux. Bien sûr, il existe d'autres fonctionnalités, mais c'est l'aspect le plus important d'un serveur de messagerie instantanée. Il doit acheminer de nombreux messages simultanément et gérer de nombreuses connexions TCP / IP.
Nous avons donc 2 fonctionnalités:
- gérer de nombreuses connexions
- acheminer les messages en fonction de certains aspects du message
Ce sont des exemples où erlang brille.
gérer de nombreuses connexions
Il est très facile de construire des serveurs TCP / IP évolutifs non bloquants avec erlang. En fait, il a été conçu pour résoudre ce problème. Et étant donné qu'il peut générer des centaines de milliers de processus (et non des threads , c'est une approche de partage rien, qui est plus simple à concevoir), ejabberd est conçu comme un ensemble de processus erlang (qui peuvent être distribués sur plusieurs serveurs):
- processus de connexion client
- processus de routeur
- processus de chat
- processus serveur à serveur
Tous échangent des messages.
acheminer les messages en fonction de certains aspects du message
Une autre caractéristique très attrayante d'erlang est la correspondance de motifs . Il est utilisé dans toute la langue.
Par exemple, dans ce qui suit:
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.
C'est 5 versions différentes de la access
fonction. Erlang sélectionnera la version la plus appropriée compte tenu des arguments reçus. ( Config
est une structure de type#config
qui a un type
attribut).
Cela signifie que c'est très facile et beaucoup plus clair que le chaînage if/else
ouswitch/case
d'établir des règles commerciales.
Envelopper
Écrire des serveurs évolutifs, c'est tout l'intérêt d'Erlang. Tout est conçu pour que cela soit facile. Sur les deux fonctionnalités précédentes, j'ajouterais:
- mise à niveau de code à chaud
mnesia
, base de données relationnelle distribuée (incluse dans la distribution de base)
mochiweb
, sur lequel la plupart des serveurs http erlang sont construits
- prise en charge binaire (décodage et encodage du protocole binaire plus facile que jamais)
- une grande communauté avec de grands projets open source (
ejabberd
, couchdb
mais aussi webmachine
, riak
et une flopée de bibliothèques très faciles à intégrer)
Moins de LOC
Il y a aussi cet article de Richard Jones. Il a réécrit une application de C ++ vers erlang: 75% de lignes en moins dans erlang.