ejabberd es una de las aplicaciones de erlang más conocidas y con la que aprendí erlang.
Creo que es uno de los proyectos más interesantes para aprender erlang porque realmente se basa en la fuerza de erlang. (Sin embargo, algunos argumentarán que no es OTP, pero no se preocupen, todavía hay un tesoro de gran código dentro ...)
Por qué ?
Un servidor XMPP (como ejabberd) puede verse como un enrutador de alto nivel, enrutando mensajes entre usuarios finales. Por supuesto, hay otras características, pero este es el aspecto más importante de un servidor de mensajería instantánea. Tiene que enrutar muchos mensajes simultáneamente y manejar muchas conexiones TCP / IP.
Entonces tenemos 2 características:
- manejar muchas conexiones
- enrutar mensajes dados algunos aspectos del mensaje
Estos son ejemplos donde erlang brilla.
manejar muchas conexiones
Es muy fácil construir servidores TCP / IP escalables sin bloqueo con erlang. De hecho, fue diseñado para resolver este problema. Y dado que puede generar cientos de miles de procesos (y no hilos , es un enfoque de compartir nada, que es más simple de diseñar), ejabberd está diseñado como un conjunto de procesos erlang (que se pueden distribuir en varios servidores):
- proceso de conexión del cliente
- proceso de enrutador
- proceso de sala de chat
- procesos de servidor a servidor
Todos ellos intercambian mensajes.
enrutar mensajes dados algunos aspectos del mensaje
Otra característica muy adorable de erlang es la coincidencia de patrones . Se usa en todo el idioma.
Por ejemplo, en lo siguiente:
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.
Eso son 5 versiones diferentes de la access
función. Erlang seleccionará la versión más apropiada dados los argumentos recibidos. ( Config
es una estructura de tipo #config
que tiene un type
atributo).
Eso significa que es muy fácil y mucho más claro que encadenar if/else
o switch/case
hacer reglas comerciales.
Para concluir
Escribir servidores escalables, ese es el objetivo de erlang. Todo está diseñado para que sea fácil. En las dos características anteriores, agregaría:
- actualización de código activo
mnesia
, base de datos relacional distribuida (incluida en la distribución base)
mochiweb
, en el que se basan la mayoría de los servidores http erlang
- soporte binario (decodificar y codificar el protocolo binario es más fácil que nunca)
- una gran comunidad con grandes proyectos de código abierto (
ejabberd
, couchdb
sino también webmachine
, riak
y un montón de biblioteca muy fácil de encajar)
Menos LOCs
También hay este artículo de Richard Jones. Reescribió una aplicación de C ++ a erlang: 75% menos líneas en erlang.