ejabberd to jedna z najbardziej znanych aplikacji erlang, z którą się nauczyłem.
Myślę, że jest to jeden z najciekawszych projektów do nauki Erlangu, ponieważ naprawdę opiera się na sile Erlanga. (Jednak niektórzy twierdzą, że to nie jest OTP, ale nie martw się, jest jeszcze mnóstwo świetnego kodu w środku ...)
Czemu ?
Serwer XMPP (taki jak ejabberd) może być postrzegany jako router wysokiego poziomu, kierujący wiadomości między użytkownikami końcowymi. Oczywiście istnieją inne funkcje, ale jest to najważniejszy aspekt serwera wiadomości błyskawicznych. Musi kierować wiele wiadomości jednocześnie i obsługiwać wiele połączeń TCP / IP.
Mamy więc 2 funkcje:
- obsłużyć wiele połączeń
- trasuj wiadomości, biorąc pod uwagę niektóre aspekty wiadomości
Są to przykłady, w których świeci erlang.
obsłużyć wiele połączeń
Bardzo łatwo można zbudować skalowalne, nieblokujące się serwery TCP / IP za pomocą erlang. W rzeczywistości został zaprojektowany, aby rozwiązać ten problem. Biorąc pod uwagę, że może on wygenerować setki tysięcy procesów (a nie wątków , jest to podejście typu „nic nie udostępniaj”, które jest prostsze w projektowaniu), ejabberd został zaprojektowany jako zestaw procesów erlang (które mogą być dystrybuowane na kilku serwerach):
- proces połączenia klienta
- proces routera
- proces czatu
- procesy serwer-serwer
Wszyscy wymieniają się wiadomościami.
trasuj wiadomości, biorąc pod uwagę niektóre aspekty wiadomości
Kolejną bardzo uroczą funkcją erlang jest dopasowywanie wzorów . Jest używany w całym języku.
Na przykład:
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.
To 5 różnych wersji access
funkcji. Erlang wybierze najbardziej odpowiednią wersję, biorąc pod uwagę otrzymane argumenty. ( Config
jest strukturą typu, #config
która ma type
atrybut).
Oznacza to, że jest to bardzo łatwe i znacznie bardziej przejrzyste niż tworzenie łańcuchów if/else
lub switch/case
tworzenie reguł biznesowych.
Owinąć
Pisanie skalowalnych serwerów - o to właśnie chodzi w Erlangu. Wszystko zostało zaprojektowane tak, aby było to łatwe. Do dwóch poprzednich funkcji dodam:
- aktualizacja kodu gorącego
mnesia
, rozproszona relacyjna baza danych (zawarta w dystrybucji podstawowej)
mochiweb
, na których zbudowana jest większość serwerów HTTP Erlang
- obsługa binarna (dekodowanie i kodowanie protokołu binarnego łatwe jak zawsze)
- wielka społeczność z wielkich projektów open source (
ejabberd
, couchdb
ale także webmachine
, riak
i zabił biblioteki bardzo łatwy do ankiety)
Mniej LOC
Jest też ten artykuł od Richarda Jonesa. Przepisał aplikację z C ++ na erlang: o 75% mniej wierszy w erlang.