martes, 6 de marzo de 2012

Erlang y WebChats (I)

[INTRODUCCIÓN]
¿Sabes esta sensación que te recorre el cuerpo cuando te miras a los ojos con otra persona y estás seguro de que es tu alma gemela, de que has encontrado el amor de tu vida, y que no quieres mas que pasar el resto de tu vida con ella?

Pues yo no.

Pero supongo que algo parecido me ha pasado con Erlang. Bromas aparte. Es un lenguaje de programación que me ha encantado y al que le pienso dedicar muchas horas en los próximos meses. No se si ha sido amor a primera vista, o que simplemente me pilla en un momento en el que me molan las cosas chungas, extrañas y muy diferentes.

[PROBLEMA]
Os explico de donde viene todo esto. Resulta a través de highscalability.com acabé en una página del blog de What'sApp[1] en donde pone algo tal que así:

[...] Over the past few months we have been making a lot of improvements to our servers to increase the performance, uptime and scalability. Today we have tuned some knobs, shifted some traffic around and achieved 1 million established tcp sessions on a single machine [...] For those curious how we did it, the technology on the backend is simple: FreeBSD + Erlang [...]
Un millón de conexiones TCP. En una sola máquina ¡Wow!

Justo cuando lo leí me entró muchísima de curiosidad por el tema. Las únicas pistas que daban eran FreeBSD (SO que Unix-like, que ya he probado en casa alguna vez) y.... Erlang. ¿Qué es Erlang? Pues de la wikipedia[2] sacamos (y marco las partes que me llamaron la atención):

Erlang es un lenguaje de programación concurrente. El subconjunto de programación secuencial de Erlang es un lenguaje funcional, con evaluación estricta, asignación única, y tipado dinámico. Fue diseñado en la compañía Ericsson para realizar aplicaciones distribuidas, tolerantes a fallos, soft-real-time y de funcionamiento ininterrumpido. Proporciona el cambio en caliente de código de forma que éste se puede cambiar sin parar el sistema. Originalmente, Erlang era un lenguaje propietario de Ericsson, pero fue cedido como software de código abierto en 1998.

Bueno, suena genial. Pues solo con esta información, o sea, sabiendo que WhatsApp había conseguido tener 1M de conexiones TCP en una misma máquina, y viendo mas o menos las caraterísticas principales de Erlang me dije: Si ellos han podido, yo también puedo.

[NUDO]
Umm.... si lo piensas así en frio puedes decir: cágate, lorito. Y entonces me comentarías:
- A ver, Jan. No sabes cuantos empleados tiene What'sApp. Ni la pasta que manejan. Ni los cracks que puedan tener contratados. Ni muchas otras cosas que pueden influir en el éxito de un proyecto así.... ¿No crees que te estás pasando un poquitín?
Y yo te voy a contestar:
- Pues no. Ellos han conseguido hacer un millón de conexiones TCP's a una sola máquina. Y si ellos pueden, yo también. Y punto.

[PRESENTACIÓN DEL PROBLEMA/EJECRCICIO]
Bien. Entonces necesito pensar en un proyectito que sea chulo, y con el que aprender Erlang. A la vez tiene que ser algo lo suficientemente simple como para que el problema no me sobrepase al inicio, pero que lo pueda ir complicando bastante a medida que vaya aprendiendo. Y, ¿en qué he pensado? Pues en un Web Chat!

¿Que qué es un web chat? Pues hombre, algo como "el chat de facebook" ( ¬¬' así seguro que todo el mundo lo entiendea).

Pues nada, la gracia es hacer un WebChat que soporte mucha carga. Se tendrá que desarollar tanto la parte cliente (HTML+CSS+JS), como el servidor web (en Erlang), así como proceso de chat en si mismo (en Erlang también) y el posible acceso a datos.

¿El objetivo cuál es? Pues conseguir un servidor de chat que soporte mucha carga. De momento me conformaré con tener 10.000 usuarios funcionando al mismo tiempo (problema C10K[3]). Después intentaremos mejorar lo posible para llegar a 100K usuarios, y si no veo muy negro el tema, el objetivo final será conseguir 1M de usuarios (conexiones TCP al mismo tiempo) contra una misma máquina y obviamente que puedan hablar de manera flúida entre ellos y demás.

[RETO]
Cagonlaputa. Resulta que los de WhatsApp me están retando. Seguro que lo han hecho aposta. Han publicado un nuevo post en el blog[4] titulado "1 million is so 2011". El artículo dice:

Happy 2012 everyone!
A few months ago we published a blog post that talked about our servers doing 1 million tcp connections on a single box[1].

Today we have an update for those keeping score at home: we are now able to easily push our systems to over 2 million tcp connections!

Vale. Ya está. Si ellos han conseguido 2M de conexiones TCP en una misma máquina, des de luego que yo puedo conseguir 1M. En el mismo artículo también comparten información sobre lo que ellos entienden por una misma máquina y..... bueno.... ejem

hw.machine: amd64
hw.model: Intel(R) Xeon(R) CPU X5675 @ 3.07GHz
hw.ncpu: 24
hw.physmem: 103062118400

¡¡¡Alaaaaaa!!! ¡Vaya maquinón! 24 cores a 3.07GHz cada uno, y 103GB de memória RAM. ¡Trabajar así da gusto! Ya veremos si yo puedo acercarme o no... esto no me desanima, sino que hace que el reto sea mejor =)

[DESENLACE] (Hay desenlace porque a mi me contaron en el cole que tenía que haber siempre una presentación-nudo-desenlace)

Pues nada, que próximamente vendrán toda una serie de entradas sobre el tema. Aprender Erlang, ver sus cosas buenas y sus cosas malas, enlazar un motón de documentación útil, ver algunos ejercicios propuestos, ver qué es OTP, ver el enfoque que le damos al tema del WebChat, los benchmarks que van saliendo, las mejoras que se hacen y demás. Lo más seguro que el proyecto acabe siendo publicado en un repositorio de github/bitbucket con una licencia OpenSource ( mi primer proyecto OpenSource!! =) )

¿Que te mola el rollo? pues sigue el blog y las entradas que voy publicando. Te van a gustar. ¿Que no te mola?, no lo leas; me la suda[5].


Muy señores míos, un saludo!!



(haré como los de What's App, que queda super molón)
P.S. - Ahora mismo no busco trabajo pero las ofertas siempre son bienvenidas. Si estás interesado en contratarme, envia información de algún proyecto chulo a inedit00 [2] gmail [.] com. (Yo también busco becarias para hacer summer-interships ;)

[1]: http://blog.whatsapp.com/index.php/2011/09/one-million/
[2]: http://es.wikipedia.org/wiki/Erlang
[3]: http://www.kegel.com/c10k.html
[4]: http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/
[5]: http://inedit00.blogspot.com/2009/09/mi-primera-vez.html

2 comentarios:

  1. Oye "inedit00" o Jan o como sea, jejeje. No sé casi nada de programación (lamentablemente) pero sé algo de redes pues hice un curso técnico sobre ellas. En una ocasión me tocó trabajar en un proyecto de hacer un sistema de comunicaciones unificadas que consistía en proveer chat, voip, videoconferencia y herramientas de colaboración desde una interfaz web. En el proyecto tuve que implementar un servidor de chat y por supuesto un cliente. El cliente que usamos fue uno llamado Jappix, es un proyecto opensource y ahora recuerdo que cuando lo instalaba me pedía como dependencia unos asuntos relacionados con los erlang que mencionaste. Te lo hago saber por si acaso te puede servir de ayuda o como referencia. Espero que tu proyecto pueda salir bien.

    ResponderEliminar
  2. Gracias por el comentario, Anónimo. Puedes llamarme Jan (nombre real) o inedit00.

    Está muy chulo esto de Jappix. He visto que Jappix mini es exactamente lo que yo tenía en mente hacer, pero usando XMPP, con grupos de chats y demás. Le tendré que echar un vistazo.

    Tengo curiosidad, Anónimo por saber qué soluciones tecnológicas decidisteis usar en el proyecto de comunicaciones que comentas: En chat hemos dicho Jappix. VoIP+Videconferencia qué usasteis? Asterisk o FreeSwitch? Y en herramientas de colaboración, qué usasteis?

    Muchas gracias, y un saludo. Espero tu respuesta ;)

    ResponderEliminar