ejabberd en iyi bilinen erlang uygulaması ve erlang ile öğrendiğim biridir.
Bence erlang öğrenmek için en ilginç projelerden biri çünkü gerçekten erlang'ın gücüne dayanıyor. (Ancak bazıları bunun OTP olmadığını savunacak, ancak endişelenmeyin, içinde hala büyük bir kod var ...)
Neden ?
Bir XMPP sunucusu (ejabberd gibi), son kullanıcılar arasındaki iletileri yönlendiren üst düzey bir yönlendirici olarak görülebilir. Tabii ki başka özellikler de var, ancak bu bir anlık mesajlaşma sunucusunun en önemli yönü. Birçok iletiyi aynı anda yönlendirmeli ve birçok TCP / IP bağlantısını yönetmelidir.
Yani 2 özelliğimiz var:
- birçok bağlantıyı yönet
- mesajın bazı yönleri verilen mesajları yönlendir
Bunlar erlang'ın parladığı örneklerdir.
birçok bağlantıyı yönet
Erlang ile ölçeklenebilir, tıkanmaz TCP / IP sunucuları oluşturmak çok kolaydır. Aslında, bu sorunu çözmek için tasarlanmıştır. Ve yüz bin süreci (ve iş parçacığı değil , tasarlaması daha kolay olan bir paylaşım-hiçbir şey yaklaşımı) oluşturabildiği göz önüne alındığında, ejabberd bir dizi erlang süreci olarak tasarlanmıştır (birkaç sunucuya dağıtılabilir):
- istemci bağlantı süreci
- yönlendirici işlemi
- sohbet odası işlemi
- sunucudan sunucuya işlemler
Hepsi mesaj gönderiyor.
mesajın bazı yönleri verilen mesajları yönlendir
Erlang'ın bir başka sevimli özelliği de desen eşleşmesidir . Dil boyunca kullanılır.
Örneğin, aşağıdakilerde:
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.
Bu access
fonksiyonun 5 farklı versiyonu . Erlang, alınan argümanlar göz önüne alındığında en uygun sürümü seçecektir. ( Config
Tipte bir yapıdır #config
bir sahiptir type
özelliği).
Bu, zincirleme if/else
veya switch/case
iş kurallarını oluşturmanın çok daha kolay ve daha açık olduğu anlamına gelir .
Özetlemek için
Ölçeklenebilir sunucular yazmak, erlang'ın bütün mesele budur. Her şey bunu kolaylaştıracak şekilde tasarlanmıştır. Önceki iki özelliğe şunu ekleyeceğim:
- sıcak kod yükseltme
mnesia
, dağıtılmış ilişkisel veritabanı (taban dağıtımına dahil)
mochiweb
, çoğu http erlang sunucusunun üzerine kurulu olduğu
- ikili destek (ikili protokolü kodlamak ve kodlamak her zamanki gibi kolay)
- Büyük açık kaynak projeleri ile büyük topluluk (
ejabberd
, couchdb
ayrıca ama webmachine
, riak
ve çok kolay gömmek için kütüphaneye ilgili bir takım)
Daha az LOC
Richard Jones'un bu makalesi de var . C ++ 'dan erlang'a bir uygulama yeniden yazdı: erlang'da% 75 daha az satır.