Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Escalando que es gerundio

Kartones
November 24, 2011

Escalando que es gerundio

@ MindCamp 2.0 (February 2010)

Kartones

November 24, 2011
Tweet

More Decks by Kartones

Other Decks in Programming

Transcript

  1. ¿Quién eres? Programador .NET, ahora programador PHP (WTF?!) Ahora hago

    que trabajo en Tuenti como ingeniero de Frontend (Core team). Como no he venido aqui a hablar de mi, el que quiera saber... http://personalportfolio.kartones.net En la intimidad sigo programando en C# ;)
  2. Agenda • Motivos • BBDDs y Cacheo • Particionado y

    Archivado • Velocidad • Frameworks • Browsers • Error Handling • Herramientas • Planificación • Mobile Websites • Testing • Feedback • Conclusiones
  3. ¿Por qué escalar? • Site web con su BBDD en

    un hosting (dedicado en el mejor de los casos) • 1er warning: Aparecemos en Slashdot/Techcrunch/similar: hosting caido por exceso de tráfico hasta que salimos de portada. Temporal. • 2º warning: Las visitas no paran de subir: navegación lenta, timeouts, imágenes que no cargan, errores de Javascript,... Permanente.
  4. ¿De qué cifras hablamos? • Datos “oficiales” de Tuenti •

    +26.000.000.000 pageviews/mes • +6.000.000 mobile pageviews/mes • Peaks de +20.000 requests/seg. • +700 servidores • Chat de hasta 1.000.000 usuarios simultáneos • +85.000.000 mensajes de Chat diarios • +8.000.000 usuarios activos
  5. BBDDs • Da igual que sean para pobres (MySQL) o

    de verdad (SQL Server o similar), si el tráfico aumenta mucho caerán igual. • Solución: Escalado de BBDDs: – Escalado Horizontal: Más servidores de BBDDs + particionado de datos. – Escalado Vertical: Más CPUs, Más RAM (mejorar los servidores existentes). • Hay un límite/tope de ganancia por servidor, y añadir nuevos o mejores cuesta mucho dinero.
  6. BBDDs (II) • Optimizar las querys ayudará, pero hasta un

    umbral. • Balanceo en servidores de Reads + servidores de Writes. – Normalmente leemos muchas más veces de las que escribimos. Pero no siempre es así. – Sigue siendo muy caro. • Da igual qué hagamos, sólo emplear BBDDs es insostenible.
  7. Cache • El acceso de I/O más rápido es el

    que nunca se produce :) • Pero después de ese caso, lo mejor es un acceso a memoria en lugar de a disco. • SQL Server y otros SGBDs serios tienen caches internas, optimizadores, etc. Pero sigue siendo costoso (por CPU, por nº de conexiones, por tope de RAM…). • ¿Por qué no aprovechar lo barata que es la RAM y montar un hashtable enorme?
  8. Cache (II) • Aplicación web –> Cache en RAM ->

    BBDD • Memcached (PHP) y Velocity (.NET) • Base/premisa muy simple: – Hashtable gigante de key-value pairs de strings. – Reads: Si está en memoria deserializar, sino leer de BBDD + serializar en memoria (cachear). – Writes: Escribir en BBDD e invalidar en memoria si existía. – Normalmente se tiene también un sistema de “warm up” para datos que queramos presentes.
  9. Cache (III) • Pero nada es fácil... – Writes no

    deben actualizar valores en memoria, podría provocar una “avalancha” (típico en redes sociales). Mejor solo invalidar la clave de cache. – Particionar las claves de las caches. – Throttling/Priming: Al reiniciar un servidor de cache o cambiar muchos datos, no recargar todos los datos de golpe, es muy fácil tumbar las BBDDs. – Lazy deletes: No borrar al momento, realizar sanity checks por código y borrar datos que no existan. Deletes en cadena provocan avalanchas. – Race conditions, concurrencia, fallos eléctricos...
  10. Particiona, particiona, particiona • Se comienza particionando una tabla con

    muchos registros • Particionado simple: ID mod N • Adapta el particionado a tus datos: por provincias, por categorías, por meses... • Particionado avanzado: combinación de los anteriores • De hecho, deberías adaptar tu DAL para que soporte particionado de base y lo más transparente y escalable posible.
  11. Archivado • Archivar: Dejar los últimos X elementos, y mover

    a otro lado (tabla o servidor) el resto. • Por ejemplo, Twitter almacena (y memcachea) los X últimos status de cada usuario, el resto está archivado. Accesos muy rápidos a datos recientes, más lentos y costosos a datos antiguos. • El patrón de diseño Iterator (PHP y .NET) es muy práctico para ocultar el archivado al resto de la aplicación.
  12. Velocidad real vs. percibida • Lo importante no es que

    una web cargue rápido, sino que parezca que carga rápido. • Usar AJAX para cargar todo lo posible. Mostrar contenido básico, cargar luego el resto (Amazon no carga reviews, comentarios, etc. Hasta que no se hace scroll). • Ejecutar javascripts al final de la página. HTML5 añade el atributo “async” a <script>. • Cada HttpRequest cuenta, sobretodo si es a un site externo.
  13. Velocidad real vs. Percibida (II) • CSS Sprites: Mejor una

    imagen grande que 10 pequeñas. ASP.NET 4 trae soporte. • Usa PageSpeed e YSlow en Firefox o MySpace's Performance Tracker en IE para buscar mejoras. • El tamaño SI importa. Minimiza CSS, JS y si puedes hasta el HTML. • Desactiva el ViewState en ASP.NET si no lo necesitas.
  14. Frameworks Javascript • Los frameworks están muy bien, pero cuando

    las cosas se ponen serias, casi siempre lo mejor es un DIY (Do It Yourself). • Un framework suele tener gran % de features no necesarias, y no suelen escalar bien. • Ejemplo: Tuenti – El “framework base” pesa unos pocos KB – Módulos para diferentes Controllers – Módulos para componentes complejos (Chat, video player, ...)
  15. Browser Wars (II) • Todos los browsers tienen problemas. •

    Safari Mac != Safari Windows Firefox Windows != Firefox Linux IE6 != IE7 != IE8 • Ningún browser es 100% multiplataforma • Una forma de combatirlos: Bottom-Up capabilities: Partir de un mínimo (IE6) y subir en features, CSS e incluso JS * * En JS es inevitable terminar haciendo hacks o directamente versiones según el browser.
  16. Error Handling • “Hope for the best, plan for the

    worst” • Nunca asumas datos consistentes y existentes. • Sampling rate de errores: Si algo falla catastróficamente, podría caerse la BBDD de de errores por demasiados logs. • Nunca se loguea suficiente información... • Revisa los logs de errores, busca la fuente de los problemas recurrentes.
  17. Conoce tus herramientas • PHP es feo, mal organizado y

    extremadamente propenso a errores; pero es gratis, abierto y rápido. Ejemplos: • En PHP los Singletons son un problema: PHPUnit es un "parche", no un framework 100% unitario, al estar hecho en PHP no puede testear singletons correctamente (entre otros problemas). • PHP no es tipado: Cuidado con conversiones de datos, parámetros, SQL Injection, XSS... • Hay comandos "prohibidos" (pero disponibles), otros desaconsejados por velocidad o consumo de memoria...
  18. Conoce tus herramientas (II) • .NET es bastante más maduro

    y C# es de lo mejor que existe como lenguaje en sí. • ASP.NET WebForms maduro, bien diseñado, extensible y potente (HttpHandlers == DIY!) • NUnit/XUnit/MB Unit/VS Tests son frameworks maduros y 100% funcionales. • ASP.NET MVC: Por fin una implementación oficial (en PHP y Java llevan años). V1.0 finalizada, 2.0 en camino.
  19. Conoce tus herramientas (III) • Un bucle innecesario, unas cuantas

    variables de más, un mal liberado de objetos/memoria… No duelen en una aplicación normal. • Pero si lo multiplicamos por millones (o por miles en un segundo), entonces puede volverse muy importante. • Tener buenas costumbres de codificación, refactorizar código y leer sobre optimización de código ayuda a prevenir.
  20. Conoce tus herramientas (IV) • Visual Studio: Posiblemente, el mejor

    IDE de desarrollo existente * • Digan lo que digan los trolls linuxeros, un vim no sustituye a un entorno visual (resaltado de errores de sintaxis, refactoring, MDI/tabs/multi-monitor…). • Aprender algún shorcut y personalizar el IDE se traducen en mejoras de productividad. * Dicho incluso por gente anti-MS ;)
  21. Diseña, planifica... Piensa! • Un fallo en producción puede ser

    catastrófico. • Arreglar problemas es mucho más costoso y difícil que prevenirlos. • Lite.facebook.com : Su mera existencia denotaba un problema de diseño (excesiva información, framework que daba muchos errores,…). • MSDN: Demasiado peso de página para "solo texto", navegación muy pesada. Versiones lite y low-band (sin javascript, puro HTML) + rediseño de la versión normal.
  22. Diseña, planifica... Piensa! (II) • El protocolo de Messenger es

    un desastre: – Comenzó como intercambio de mensajes mediante comandos "modo texto“. “VER 1 MSNP11 CVR0” – Añadido soporte de XML y "ficheros" XML: Ciertos comandos devuelven XML en lugar de comando de 3 letras + parámetros estandar. – Añadido soporte de SOAP: Tras la autenticación, desde MSNP13 muchas operaciones se realizan mediante llamadas SOAP en lugar de comandos. – A ver quién es el valiente que lo reprograma y crea un wrapper para que siga funcionando MSNP18 a la vez (con +100 millones de usuarios de Messenger en todo el mundo)
  23. Mobile Websites • No por tener menos visitas hay que

    olvidarse de escalarlo. • Mucho más optimizado: No JS o sólo en WebKit, imágenes más pequeñas, menos contenido, diseño más compacto... • Cada byte “pesa” muchísimo más. • Testeo intensivo: PocketIE ni siquiera pinta CSS1 al 100%, Opera Mini parece de los 90, docenas de resoluciones distintas (todas menores al ya casi estandar 1024x768)…
  24. Mobile Websites (II) • User Agent Switcher para Firefox. •

    Reducción de diseño, pero también de features: Es imposible replicar el 100% de features de un site normal, salvo que sea algo estilo Twitter. • - WUFRL está muy lejos de ser perfecto. Ej: usa bool para XHTML_FILE_UPLOAD, con lo que se producen falsos positivos y falsos negativos. – Muchos móviles mienten respecto a sus capabilities. – User Agent detection ayuda mucho pero requiere esfuerzo. Llenos de basura no determinista. – Algunas aplicaciones lo machacan (ej: MegaUpload toolbar). – Importante mantener una BBDD de UAs. – Casi obligatorio limpiarlo, parsearlo, aplicarle lógica difusa u otro sistema de matching. – Aplica cacheo a los UAs. Recuerda: estamos operando con strings y haciendo querys a BBDD!
  25. El testing es vital • Unit tests: Backend, APIs, integraciones

    con herramientas de terceros.. • Acceptance tests: Frontend. • Regression tests, manual tests (con docs. o guidelines, no a pelo!)... • Revisar logs de errores: Parece obvio, pero se olvida a menudo. • Entorno de desarrollo, entorno de testing, pre- producción, Virtual Machines...
  26. Pero el feedback es más vital • A/B testing (excelente

    PPT), features experimentales (“Labs” de GMail), ... • El feedback de los usuarios es crítico para mejorar, sea voluntario (formularios, encuestas, focus groups, ...) o indirecto (métricas, profiling, tracking, ...) A B
  27. Cada site es un mundo... Al que aplican distintas reglas,

    trucos, etc. • Facebook deja que Google indexe sólo ciertos datos de los perfiles de usuarios. En Tuenti no hay SEO porque no dejamos que indexen. • En Tuenti usamos un load balancer hecho en Javascript y AJAX en lugar de uno por hardware. • Si tienes millones de visitas diarias, es más que recomendable especializar servidores (para servir páginas web, para BBDD, para cache, para chat…) • Code-State-Cache-Data: Mayor división “por capas”. • Azure: Cacheo, particionado, load balancing…
  28. ...y parte sirve para otros mundos EVE Online (juego multijugador

    espacial): • Hasta 30.000 jugadores concurrentes en un solo “fragmento de universo” • Windows Server 2003 x64, SQL Server 2005 • Stackless Python (scripting, no compilado!) • 150.000.000 DB transactions al día!!! (tras una capa de cacheo!)