ejabberd is one of the most well know erlang application and the one I learnt erlang with.

I think it's the one of most interesting project for learning erlang because it is really building on erlang's strength. (However some will argue that it's not OTP, but don't worry there's still a trove of great code inside...)

Why ?

An XMPP server (like ejabberd) can be seen as a high level router, routing messages between end users. Of course there are other features, but this is the most important aspect of an instant messaging server. It has to route many messages simultaneously, and handle many a lot of TCP/IP connections.

So we have 2 features:

handle many connections

route messages given some aspects of the message

These are examples where erlang shines.

handle many connections

It is very easy to build scalable non-blocking TCP/IP servers with erlang. In fact, it was designed to solve this problem. And given it can spawn hundreds of thousand of processes (and not threads, it's a share-nothing approach, which is simpler to design), ejabberd is designed as a set of erlang processes (which can be distributed over several servers) :

client connection process

router process

chatroom process

server to server processes

All of them exchanging messages.

route messages given some aspects of the message

Another very lovable feature of erlang is pattern matching. It is used throughout the language.

For instance, in the following :

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.

That's 5 different versions of the access function. Erlang will select the most appropriate version given the arguments received. ( Config is a structure of type #config which has a type attribute).

That means it is very easy and much clearer than chaining if/else or switch/case to make business rules.

To wrap up

Writing scalable servers, that's the whole point of erlang. Everything is designed it making this easy. On the two previous features, I'd add :

hot code upgrade

mnesia , distributed relational database (included in the base distribution)

, distributed relational database (included in the base distribution) mochiweb , on which most http erlang servers are built on

, on which most http erlang servers are built on binary support (decoding and encoding binary protocol easy as ever)

a great community with great open source projects ( ejabberd , couchdb but also webmachine , riak and a slew of library very easy to embed)

Fewer LOCs

There is also this article from Richard Jones. He rewrote an application from C++ to erlang: 75% fewer lines in erlang.