Softonic Labs - Web Escalable

3,081 views

Published on

Proyectos web escalable, consejos y herramientas.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,081
On SlideShare
0
From Embeds
0
Number of Embeds
794
Actions
Shares
0
Downloads
41
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Softonic Labs - Web Escalable

  1. 1. Web Escalable Mejorando el rendimiento en aplicaciones web 12/2008
  2. 2. Resumen <ul><li>Breve Introducción </li></ul><ul><li>Cacheando contenidos </li></ul><ul><li>Contenido en las nubes (cloud computing) </li></ul><ul><li>Peticiones de datos paralelas </li></ul><ul><li>Near Time Processing </li></ul><ul><li>Particionar los datos </li></ul><ul><li>Buenos consejos a seguir </li></ul><ul><li>Conclusiones </li></ul>Presentación basada en el workshop de Joe Stump (Digg) en el FOWA Resumen – Softonic Labs
  3. 3. Introducción : Datos de Softonic <ul><li>47.026.736 usuarios únicos </li></ul><ul><li>69.745.943 Visitas </li></ul><ul><li>351.747.621 Páginas vistas </li></ul><ul><li>Más de 100 servidores entre frontends y backends </li></ul>Datos de Google Analytics en Softonic para Diciembre 2008 Introducción – Softonic Labs
  4. 4. Introducción : Fases de un proyecto <ul><li>1 servidor </li></ul><ul><li>Todas las aplicaciones en la misma máquina </li></ul><ul><li>Cuello de botella único </li></ul><ul><li>Punto de fallo único </li></ul>1. Nacimiento Introducción – Softonic Labs 2. Juventud 3. Madurez <ul><li>n servidores </li></ul><ul><li>Distribuir aplicaciones en distintas máquinas </li></ul><ul><li>Alta disponibilidad </li></ul><ul><li>Múltiples Mysql, múltiples frontends… </li></ul><ul><li>Aplicación distribuida en distintos hostings (arround the world) </li></ul>
  5. 5. Introducción : Lenguaje Programación <ul><li>Hay desarrolladores disponibles? </li></ul><ul><li>Está bien soportado? </li></ul><ul><li>Tiene una comunidad detrás? </li></ul><ul><li>Te hace feliz? </li></ul>Como seleccionar un lenguaje de programación Introducción – Softonic Labs Aspectos técnicos <ul><li>El rendimiento del lenguaje no importa. </li></ul><ul><li>PHP no es escalable </li></ul><ul><li>Ejemplo : Comparando PHP vs Ruby tenemos un 3% de diferencia. </li></ul>
  6. 6. Introducción : ¿Como se puede escalar? Scaling Up Scaling Out <ul><li>Más CPU </li></ul><ul><li>Más memoria </li></ul><ul><li>Más máquina </li></ul><ul><li>Sencillo </li></ul><ul><li>Muy limitado </li></ul><ul><li>Más máquinas </li></ul><ul><li>Distribuir </li></ul><ul><li>Descentralizar </li></ul><ul><li>Complicado </li></ul><ul><li>Es el camino a seguir </li></ul>Servidor Servidor Servidor Servidor Servidor Servidor Servidor
  7. 7. Introducción : CAP Theorem <ul><li>Strong C onsistency : Sin fallos </li></ul><ul><li>High A vailability : Que aguante </li></ul><ul><li>P artition Tolerance : Divisible </li></ul>Los tres puntos principales a tener en cuenta <ul><li>No compartir. Tener servidores separados para cada servicio </li></ul><ul><li>Descentralizar. Repartir aplicaciones entre distintas máquinas </li></ul><ul><li>Esperar fallos. Tarde o temprano el Hard o el Soft van a fallar </li></ul><ul><li>Añadir más máquinas. Para crecer es suficiente con añadir Hardware. </li></ul>¿Cómo lograrlo?
  8. 8. Cacheando : Opciones <ul><li>En disco </li></ul><ul><ul><li>Fácil </li></ul></ul><ul><ul><li>Barato </li></ul></ul><ul><ul><li>No compartido </li></ul></ul><ul><ul><li>Lento </li></ul></ul><ul><li>En memoria </li></ul><ul><ul><li>APC (No comartido, datos estáticos) </li></ul></ul><ul><ul><li>Memcached (distribuído) </li></ul></ul><ul><li>In the clouds </li></ul><ul><ul><li>Datos estáticos no volátiles : ficheros, imágenes, videos… </li></ul></ul><ul><ul><li>OMG Files (Mogile FS) </li></ul></ul><ul><ul><li>MemcacheDB </li></ul></ul><ul><ul><li>Amazon S3 </li></ul></ul>
  9. 9. Cacheando : ¿Dónde? <ul><li>En la aplicación (FrontEnd) </li></ul><ul><ul><li>Librerías de acceso a caché (PHP. Python…) </li></ul></ul><ul><ul><li>El más barato </li></ul></ul><ul><li>Por software </li></ul><ul><ul><li>Varnish </li></ul></ul><ul><ul><li>Squid </li></ul></ul><ul><ul><li>Precio intermedio </li></ul></ul><ul><li>Por Hardware </li></ul><ul><ul><li>Dispositivos especializados </li></ul></ul><ul><ul><li>Mucho más caro </li></ul></ul>
  10. 10. Cacheando : Buenas técnicas - 1 <ul><li>Que la caché nunca expire. Borrar desde software cuando exista una modificación en los datos </li></ul><ul><li>Hacer flush del total o de partes determinadas modificando un prefijo en el identificador del caché ( A_cache_id  B_cache_id ). Los datos antiguos ya caducarán cuando les toque. </li></ul><ul><li>Utilizar multi-get (hacer fetch en diferentes servidores memcached) . Ganancias de hasta el 400% </li></ul><ul><li>Expiración explícita. Cachear módulos por separado con tiempos de expiración distintos. </li></ul><ul><li>Utilizar una cadena de responsabilidad según objetos a cachear: </li></ul><ul><li>Ejemplo : 1- APC, 2-Memcached, 3-Siguiente cadena… </li></ul>
  11. 11. Cacheando : Buenas técnicas - 2 <ul><li>Agrupamiento inteligente. Ageupar aquellos datos que puedan expirar a la vez </li></ul><ul><li>Tiempos de expiración puestos time+random para evitar la expiración simultánea de datos </li></ul><ul><li>Distintos Pool de Memcached (opción de compilación) optimizados según el tamaño de los objetos a cachear </li></ul><ul><li>Tener las variables de Session en Memcached </li></ul>
  12. 12. Contenido en las nubes - 1 <ul><li>Cloud Services : Amazon S3 </li></ul><ul><ul><li>Fácil de implementar </li></ul></ul><ul><ul><li>Sin Hardware adicional </li></ul></ul><ul><ul><li>Razonablemente barato </li></ul></ul><ul><ul><li>http://aws.amazon.com/s3/ </li></ul></ul><ul><li>Network File System (NFS) </li></ul><ul><ul><li>Fácil de implementar </li></ul></ul><ul><ul><li>Necesita Hardware </li></ul></ul><ul><ul><li>No es escalable (Single Point of Failure) </li></ul></ul><ul><ul><li>No es una solución a largo plazo </li></ul></ul><ul><ul><li>http://es.wikipedia.org/wiki/NFS </li></ul></ul>
  13. 13. Contenido en las nubes - 2 <ul><li>MogileFS </li></ul><ul><ul><li>Muy complejo de instalar y mantener (mínimo 3 servidores) </li></ul></ul><ul><ul><li>Escala sin problemas </li></ul></ul><ul><ul><li>Soporte para WebDAV y PHP </li></ul></ul><ul><ul><li>Utilizado en SixApart, Digg, LiveJournal… </li></ul></ul><ul><ul><li>http://www.danga.com/mogilefs/ </li></ul></ul><ul><li>CDN </li></ul><ul><ul><li>100% Outsourced </li></ul></ul><ul><ul><li>Muy caro </li></ul></ul><ul><ul><li>Escala sin problemas </li></ul></ul><ul><ul><li>http://www.cdn.com </li></ul></ul>
  14. 14. Contenido en las nubes – 3 <ul><li>GlusterFS </li></ul><ul><ul><li>Más fácil de instalar y mantener </li></ul></ul><ul><ul><li>Posix 100% </li></ul></ul><ul><ul><li>Escala sin problemas </li></ul></ul><ul><ul><li>http://www.glusterfs.org/ </li></ul></ul><ul><li>Crea tu propio sistema especializado </li></ul><ul><ul><li>Sólo si el almacenamiento es tu negocio </li></ul></ul><ul><ul><li>Muy complejo </li></ul></ul><ul><ul><li>Personalizable </li></ul></ul>
  15. 15. Peticiones de datos paralelas <ul><li>Lanzar peticiones HTTP en paralelo y de forma asíncrona. </li></ul><ul><ul><li>Abrir sockets, realizar consultas y bloquear hasta recibir todas las respuestas. </li></ul></ul><ul><ul><li>PHP (5.2+) curl_multi : http://www.somacon.com/p537.php </li></ul></ul><ul><ul><li>Mover modelos (MVC) a web services </li></ul></ul><ul><ul><li>Abrir API de consulta (interna o externa) </li></ul></ul><ul><li>Gearman </li></ul><ul><ul><li>Consultas Paralelas </li></ul></ul><ul><ul><li>Asíncrono </li></ul></ul><ul><ul><li>Fork() distribuído </li></ul></ul><ul><ul><li>http://www.danga.com/gearman/ </li></ul></ul>
  16. 16. Near Time Processing <ul><li>Acciones que no requieren respuesta inmediata </li></ul><ul><li>Procesamiento de acciones en tiempo “casi” real </li></ul><ul><li>Eventualmente consistente </li></ul><ul><li>Asíncrono </li></ul><ul><li>Paralelo </li></ul>
  17. 17. Near Time Processing – Opciones - 1 <ul><li>Cron </li></ul><ul><ul><li>Muy sencillo </li></ul></ul><ul><ul><li>Bueno para trabajos en background </li></ul></ul><ul><ul><li>No descentralizado </li></ul></ul><ul><li>Gearman </li></ul><ul><ul><li>Balanceador de carga de llamadas a funciones </li></ul></ul><ul><ul><li>Sencillo </li></ul></ul><ul><ul><li>Escala bien </li></ul></ul><ul><ul><li>Descentralizado </li></ul></ul><ul><ul><li>Sin Garantías (si el proceso falla no es el fin del mundo) </li></ul></ul><ul><ul><li>Reintentos por parte del cliente </li></ul></ul>
  18. 18. Near Time Processing – Opciones – 2 <ul><li>Sistema de colas </li></ul><ul><ul><li>Grid Engine de SUN : http://gridengine.sunsource.net/ </li></ul></ul><ul><ul><li>Starling : http://rubyforge.org/projects/starling/ </li></ul></ul><ul><ul><li>MemcacheQ : http://memcachedb.org/memcacheq/ </li></ul></ul><ul><ul><li>Beanstalk : http://xph.us/software/beanstalkd/ </li></ul></ul><ul><ul><li>Gearman/Schwartz (con garantía de éxito y reintentos) </li></ul></ul><ul><li>EC2 de Amazon </li></ul><ul><ul><li>Casi ilimitado </li></ul></ul><ul><ul><li>No se puede compartir </li></ul></ul><ul><ul><li>Utilizado para Bots, Crawlers… </li></ul></ul>
  19. 19. Particionar los datos – Horizontal <ul><li>La misma tabla en distintos masters </li></ul><ul><li>Evita cuellos de botella de escritura </li></ul><ul><li>Es distribuido </li></ul><ul><li>Permite tener tablas más pequeñas y manejables (ALTERS) </li></ul><ul><li>El criterio de partición es distinto en cada proyecto (país, empresa, departamento...) </li></ul>Usuarios 192.68.0.1 Usuarios 192.68.0.2 Usuarios 192.68.0.3
  20. 20. Particionar los datos – Vertical <ul><li>Separar distintas tablas en distintos masters </li></ul><ul><li>Distribuyes la carga entre servidores </li></ul><ul><li>Evita que largos alters de tablas saturen el servidor </li></ul>Usuarios 192.68.0.1 Preferencias 192.68.0.2 Items 192.68.0.3
  21. 21. Particionar los datos – Herramientas <ul><li>MemcacheDB </li></ul><ul><ul><li>Memcache + BDB </li></ul></ul><ul><ul><li>28.000 escrituras/seg </li></ul></ul><ul><ul><li>Alta disponibilidad y replicación </li></ul></ul><ul><ul><li>Datos desnormalizados. </li></ul></ul><ul><ul><li>http://code.google.com/p/memcachedb/ </li></ul></ul><ul><li>IDDB </li></ul><ul><ul><li>Sistema propio de Digg </li></ul></ul><ul><ul><li>Permite particiones elásticas </li></ul></ul><ul><ul><li>Eventualmente consistente </li></ul></ul><ul><ul><li>Tipos de particiones variables </li></ul></ul>
  22. 22. Buenos consejos a seguir <ul><li>Reducir peticiones HTTP </li></ul><ul><li>Evitar CSS y JS inline </li></ul><ul><li>Compresión y minificación </li></ul><ul><li>Aprovechar ventajas de HTTP/1.1 </li></ul>
  23. 23. Conclusiones <ul><li>No compartir, desnormalizar </li></ul><ul><li>Cachear y poner en cola </li></ul><ul><li>Reducir, reciclar y reutilizar </li></ul>

×