ejabberd ist eine der bekanntesten erlang-Anwendungen und die, mit der ich erlang gelernt habe.
Ich denke, es ist eines der interessantesten Projekte zum Erlernen von erlang, weil es wirklich auf erlangs Stärke aufbaut. (Einige werden jedoch argumentieren, dass es kein OTP ist, aber keine Sorge, es steckt immer noch eine Menge großartiger Codes darin ...)
Warum ?
Ein XMPP-Server (wie ejabberd) kann als High-Level-Router angesehen werden, der Nachrichten zwischen Endbenutzern weiterleitet. Natürlich gibt es noch andere Funktionen, aber dies ist der wichtigste Aspekt eines Instant Messaging-Servers. Es muss viele Nachrichten gleichzeitig weiterleiten und viele TCP / IP-Verbindungen verarbeiten.
Wir haben also 2 Funktionen:
- viele Verbindungen behandeln
- Routen von Nachrichten unter Berücksichtigung einiger Aspekte der Nachricht
Dies sind Beispiele, bei denen erlang glänzt.
viele Verbindungen behandeln
Mit erlang ist es sehr einfach, skalierbare, nicht blockierende TCP / IP-Server zu erstellen. Tatsächlich wurde es entwickelt, um dieses Problem zu lösen. Und da es Hunderttausende von Prozessen erzeugen kann (und keine Threads , es ist ein Share-Nothing-Ansatz, der einfacher zu entwerfen ist), ist ejabberd als eine Reihe von erlang-Prozessen konzipiert (die auf mehrere Server verteilt werden können):
- Client-Verbindungsprozess
- Router-Prozess
- Chatroom-Prozess
- Server-zu-Server-Prozesse
Alle tauschen Nachrichten aus.
Routen von Nachrichten unter Berücksichtigung einiger Aspekte der Nachricht
Ein weiteres sehr liebenswertes Merkmal von erlang ist der Mustervergleich . Es wird in der gesamten Sprache verwendet.
Zum Beispiel im Folgenden:
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.
Das sind 5 verschiedene Versionen der access
Funktion. Erlang wählt die am besten geeignete Version unter Berücksichtigung der erhaltenen Argumente aus. ( Config
ist eine Struktur vom Typ, #config
die ein type
Attribut hat).
Das heißt, es ist sehr einfach und viel klarer als Verketten if/else
oder switch/case
Geschäftsregeln zu erstellen.
Einwickeln
Das Schreiben skalierbarer Server ist der springende Punkt bei erlang. Alles ist so gestaltet, dass es einfach ist. Zu den beiden vorherigen Funktionen möchte ich hinzufügen:
- Hot-Code-Upgrade
mnesia
, verteilte relationale Datenbank (in der Basisverteilung enthalten)
mochiweb
, auf denen die meisten http erlang Server basieren
- Binärunterstützung (Dekodierung und Kodierung des Binärprotokolls einfach wie immer)
- eine große Gemeinschaft mit großen Open - Source - Projekten (
ejabberd
, couchdb
sondern auch webmachine
, riak
und eine ganze Reihe von Bibliothek sehr einfach zu einbetten)
Weniger LOCs
Es gibt auch diesen Artikel von Richard Jones. Er hat eine Anwendung von C ++ nach erlang umgeschrieben: 75% weniger Zeilen in erlang.