O ejabberd é um dos aplicativos erlang mais conhecidos e com o qual aprendi erlang.
Eu acho que é o projeto mais interessante para aprender erlang, porque está realmente construindo a força de erlang. (No entanto, alguns argumentam que não é OTP, mas não se preocupe, ainda há um grande número de códigos dentro ...)
Por quê ?
Um servidor XMPP (como o ejabberd) pode ser visto como um roteador de alto nível, roteando mensagens entre usuários finais. Claro que existem outros recursos, mas esse é o aspecto mais importante de um servidor de mensagens instantâneas. Ele precisa rotear muitas mensagens simultaneamente e lidar com muitas conexões TCP / IP.
Portanto, temos 2 recursos:
- lidar com muitas conexões
- encaminhar mensagens devido a alguns aspectos da mensagem
Estes são exemplos em que erlang brilha.
lidar com muitas conexões
É muito fácil criar servidores TCP / IP escaláveis e sem bloqueio com erlang. De fato, ele foi projetado para resolver esse problema. E, como pode gerar centenas de milhares de processos (e não threads , é uma abordagem de compartilhamento-nada, que é mais simples de projetar), o ejabberd foi projetado como um conjunto de processos erlang (que podem ser distribuídos por vários servidores):
- processo de conexão do cliente
- processo roteador
- processo de sala de chat
- processos de servidor para servidor
Todos eles trocando mensagens.
encaminhar mensagens devido a alguns aspectos da mensagem
Outra característica muito adorável do erlang é a correspondência de padrões . É usado em todo o idioma.
Por exemplo, no seguinte:
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.
São 5 versões diferentes da access
função. Erlang selecionará a versão mais apropriada, considerando os argumentos recebidos. ( Config
é uma estrutura do tipo #config
que possui um type
atributo).
Isso significa que é muito fácil e muito mais claro do que encadear if/else
ou switch/case
criar regras de negócios.
Para finalizar
Escrevendo servidores escaláveis, esse é o objetivo de erlang. Tudo foi projetado para facilitar as coisas. Nos dois recursos anteriores, eu acrescentaria:
- atualização de código quente
mnesia
, banco de dados relacional distribuído (incluído na distribuição base)
mochiweb
, nos quais a maioria dos servidores http erlang são criados
- suporte binário (decodificar e codificar o protocolo binário mais fácil do que nunca)
- uma ótima comunidade com ótimos projetos de código aberto (
ejabberd
, couchdb
mas também webmachine
, riak
e uma grande quantidade de bibliotecas muito fáceis de incorporar)
Menos LOCs
Há também este artigo de Richard Jones. Ele reescreveu um aplicativo de C ++ para erlang: 75% menos linhas em erlang.