social erlang

68
Social Erlang Carlos Abalde TPF’10 - Taller de Programación Funcional (PROLE’10) 7 de septiembre de 2010 - Valencia

Upload: carlos-abalde

Post on 17-Jul-2015

4.941 views

Category:

Education


0 download

TRANSCRIPT

Social ErlangCarlos AbaldeTPF’10 - Taller de Programación Funcional (PROLE’10)7 de septiembre de 2010 - Valencia

Contenido

• Tuenti, Yo, el Universo, y Todo lo Demás

• Backend IM Casero

• Tuenti Chat

• Un Vistazo a Facebook

• Conclusiones

Tuenti, Yo, el Universo...

Tuenti, yo, el Universo...

• VoDKA: Video on Demand Kernel...

• ARMISTICE: Advanced Risk Management...

• Social FP,

• Scala (Twitter), Haskel (Facebook)...

• Social Erlang,

• Facebook, gitHub, last.fm... Tuenti

Company profile at LinkedIn:

Tuenti is the most trafficked website in Spain, and the country's leading private social platform.

Based in Madrid, Tuenti has rapidly grown in three years with millions of active daily users and was one of the most searched terms in 2008 and 2009 in Google's annual zeitgeist.

Fuente: Google Zeitgeist

Company profile at LinkedIn:

Tuenti is the most trafficked website in Spain, and the country's leading private social platform.

Based in Madrid, Tuenti has rapidly grown in three years with millions of active daily users and was one of the most searched terms in 2008 and 2009 in Google's annual zeitgeist.

Fuente: Google Zeitgeist

Fuente: Chris Pesto

Tuenti en números

• Más de 8M usuarios

• 25.000M páginas vistas / mes (2Gbps)

• 3M fotografías subidas / día

• 2.500M imágenes servidas / día (6 Gbps)

• 100M mensajes chat / día

• 72 minutos usuario / día

• 1 CPD con más de 1.000 servidores

- Imágenes vía CDN. En pico más de 6 Gbps, 70K hits/seg.

Es-ca-la-bi-li-dad

• Javascript + PHP

• Cache (CDNs, memcached)

• BD (MySQL, Hadoop)

• Monitorización & optimización

• Sistemas

Tuenti Chat

• HackMeUp

• Contexto,

• Cuanto antes

• Bajo coste

• Integrado (p.e. listas de amigos)

• 1M de usuarios chateando a la vez

• Estable, escalable, etc.

Prueba de concepto

• Long polling (Comet / AJAX server push)

• Maximizar #clientes por servidor

• Medida coste económico

• Basado en MochiWeb (Erlang)

• http://github.com/mochi/mochiweb

• Coste mensajes vs. coste notificaciones

Gestor de conexiones

• Implementación MochiWeb básica

• Broadcast cada 10 segundos

• < 50 líneas de código Erlang

• 10K clientes

• ~ 45 KB/cliente / ~ 1% CPU

⊕ router de mensajes

• Mensajería uno a uno

• Nodos frontend HTTP & router

• +K true +P 134217727

• < 140 líneas código Erlang

• 10K clientes & 1.000 mensajes/seg

• ~ 25 KB/cliente / ~ 1% CPU

⊕ hibernación procesos

• Hibernación de clientes idle

• erlang:hibernate(Module, Function, Args).

• < 140 líneas código Erlang

• 10K clientes & 1.000 mensajes/seg

• ~ 8 KB/cliente / ~ 1% CPU

⊕ pub/sub & libevent

• Publicación/subscripción de eventos

• BD de contactos (mnesia)

• Cambios de estado

• Nuevo gestor de conexiones

• C-Node Erlang usando libevent

• MochiWeb eliminado

⊕ pub/sub & libevent

• < 230 líneas Erlang + < 160 líneas C

• 1M clientes & 16.666 mensajes/seg

• ~ 2 KB/cliente / ~ 5% CPU

Conclusiones

Conclusiones

☺ Erlang es una opción viable

☺ ¡No serán necesarios meses desarrolando!

☺ ¡¡No es necesario un nuevo CPD!!

Tuenti ChatFuente: Tuenti

Contexto

• Escalable, estable, bla bla bla... :)

• 1M usuarios conectados y charlando

• ~1 diseñador + ~1 FE + ~1 BE + ~0,5 SE

• Urgente (i.e. Facebok ya tiene el suyo)

• 1/2 meses análisis/benchmarking + 1/2 meses implementación/despliegue

Integración

• Backend existente (listas de amigos, bloqueos, borrados, autenticación...)

• Frontends existentes (web) y futuros (iPhone, Android, JME, BlackBerry...)

• Clientes desktop

• Federación con otros servicios

• Sin persistencia de datos

Solución casera

✓ Eficiente, a medida & muy cool

✗ Costoso en tiempo

✗ Propenso a errores

✗ Implementación de clientes

✗ Mantenimiento

XMPP

• Extensible Messaging & Presence Protocol

• Estándar abierto & flexible

• Overhead backend

• Orientado a conexión

• HTTP Polling: XEP-0025

• HTTP Binding: XEP-0124 (long polling)

ejabberd

• ProcessOne

• Erlang + Open Source + Maduro + Activo

• Alternativas,

• Openfire (Java)

• Tigase (Java)

• jabberd2 (C)

• ...

Benchmarking

• Parámetros,

• Tamaño del roster

• Frecuencia de las reconexiones

• Volumen de mensajes

• Picos de tráfico

• ¿Cómo?

• Tsung, Jabsimul, ad-hoc (Erlang, C)...

Optimización (I)

• Particionamiento en dos niveles,

1. Ubicación geográfica

2. Id de usuario (mod vs. rangos)

• Partición dominios XMPP en varias VMs

+ Disponibilidad

+ Mantenibilidad

• Migraciones transparentes entre VMs

Optimización (II)

• Recolecciones de basura e hibernaciones de procesos explícitas

• Compactación de Jabberd ids

•xmpp{\d+}.tuenti.com

• Parseado XML frontend XEP-0124

• Cross-domain

Optimizacion (y III)

• Controles extra,

• Politicas de contención de paquetes de presencia (broadcasts)

• ACLs bloqueo/desbloqueo

Adaptación

• Filtrado de funcionalidades

• API interna

• Autenticación ad-hoc C2S

• Nuevos paquetes S2S

• Broadcast de comandos de control

• Rate limiting

Despliegue (I)

• Infraestructura sistemas,

• Configuración de red compleja

• Balanceadores

• Métricas client y server side

Despliegue (y II)

• Dark launch (1 semana)

• Reconexiones, mensajes & cambios de estado ocultos

• Iteraciones & monitorización

• Cuellos de botella en procesos S2S

• Presence probes

• Apertura progresiva durante 24h

Un Vistazo a FacebookFuente: Facebook

- MochiWeb es usada para la gestión del número masivo de conexiones long polling en los channel servers.

Fuente: Carlos Abalde @ Facebook

- MochiWeb es usada para la gestión del número masivo de conexiones long polling en los channel servers.

Fuente: Carlos Abalde @ Facebook

- MochiWeb es usada para la gestión del número masivo de conexiones long polling en los channel servers.

Fuente: Carlos Abalde @ Facebook

Referencias

“Facebook Engineering’s Notes”http://www.facebook.com

Chris Piro y Eugene Letuchy“Functional Programming at Facebook”Commercial Users of Functional Programming4 de septiembre de 2009

Tipos de interacción

↦ Envío de mensajes

• AJAX estándar ~ Tuenti

↤ Recepción de mensajes

• Long polling vía AJAX ~ Tuenti

⟳ Actualizaciones del roster

• Polling periódico vía AJAX

Componentes (I)

• Servidores de canales (Erlang)

• MochiWeb

• Enrutamiento de mensajes

• Una cola/proceso por usuario

• Particionamiento por user id

• Un cluster por partición

Componentes (II)

• Servidores de presencia (C++)

• Agregación de usuarios & estados

• Servidores de logging (C++)

• Recarga de estado entre clicks

• Facebook vs. Tuenti (100% AJAX)

Componentes (y III)

• Frontales XMPP (Erlang)

• ejabberd

• Introducido en una segunda fase

•Thrift

• Framework RPC eficiente

• Integración de componentes

ConclusionesFuente: Open Source Erlang

Erlang (I)

✓ Escala masiva & paralelismo baratos

✓ Implementacion natural

• 1 usuario - 1 proceso

✓ Distribución natural

✓Ágil (i.e. centrado en el problema)

✓ Aislamiento de bugs

Erlang (y III)

✗ Punto único de fallo

• Resolución de bugs

• Reconfiguraciones

• Situaciones de emergencia

✗ Utilidades de despliegue separadas

✗ Infraestructura diferente

http://jobs.tuenti.com

TPF ! gracias