Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Optimiza tus webs Grails. Greach 2011

4,220 views

Published on

Published in: Technology
  • Be the first to comment

Optimiza tus webs Grails. Greach 2011

  1. 1. optimiza tus webs Grails <ul><li>Greach - Noviembre 2011 </li></ul><ul><li>Dani Latorre </li></ul>
  2. 2. ¿Quién soy? <ul><li>Desarrollador web independiente </li></ul><ul><li>Jobsket, elDisparate, CachiruloValley... </li></ul><ul><li>Google Summer of Code 2008 </li></ul><ul><li>www.danilat.com </li></ul><ul><li>@dani_latorre </li></ul>
  3. 3. Velocidad <ul><li>La velocidad es una magnitud física de carácter vectorial que expresa el desplazamiento de un objeto por unidad de tiempo. </li></ul>
  4. 4. A mayor velocidad de respuesta <ul><li>Escalabilidad </li></ul><ul><li>Costes </li></ul><ul><li>SEO </li></ul><ul><li>UX </li></ul>
  5. 5. ¿Cómo? <ul><li>Cuidar la base de datos </li></ul><ul><li>Minimizar operaciones en la request </li></ul><ul><li>Buenas prácticas en la capa web </li></ul>
  6. 6. Cuidar la Base de Datos
  7. 7. Acceso a bases de datos <ul><li>No guardar constantes </li></ul><ul><li>Desnormalizar </li></ul><ul><li>Contadores </li></ul><ul><li>Evitar el problema N+1 </li></ul><ul><li>Cachés </li></ul>
  8. 8. Evitar N+1 <ul><li>fetch: ‘join’ </li></ul>class Comment{ Post post String author ... static mapping{ post fetch: ‘join’ } } def comments = Comment.findAllByAuthor(“Dani”, [fetch:[post:‘join’]]) comments.each{ println it.post.title }
  9. 9. Caché de primer Nivel <ul><li>Ahorra tráfico en la red </li></ul><ul><li>Sin flush:true en .save() y .delete() </li></ul>
  10. 10. Caché de segundo nivel <ul><li>read-only: Datos de sólo lectura. </li></ul><ul><li>nonstrict-read-write: Escenarios con frecuentes lecturas y pocas actualizaciones. </li></ul><ul><li>read-write: Escenarios con actualizaciones frecuentes. No soporta transacciones. </li></ul><ul><li>transactional: Se requiere un proveedor que lo soporte (JBoss TreeCache). </li></ul>
  11. 11. Caché de segundo nivel <ul><li>Clases de dominio y asociaciones </li></ul>class Post{ ... static hasMany = [comments: Comments] static mapping { cache ‘nonstrict-read-write’ comments cache: ‘read-write’ } }
  12. 12. Caché de consultas <ul><li>cache: true </li></ul>def groovyPosts = Post.findAllByTitle(“%Groovy%”, [cache:true]) def groovyPosts = Post.withCriteria{ like(‘title’, “%Groovy%”) cache:true }
  13. 13. Spring Cache Plugin <ul><li>Cachear métodos de un Bean, incluso actions de Controllers </li></ul>@Cacheable(&quot;pirateCache&quot;) def getPirates() { // return a list of pirates } @CacheFlush(&quot;pirateCache&quot;) void registerNewPirate(Pirate sailor) { // store a new pirate }
  14. 14. Minimizar las Operaciones en la Request
  15. 15. Quitar de la request <ul><li>Envío de emails </li></ul><ul><li>Actualizar datos desnormalizados </li></ul><ul><li>Re-calcular estadísticas </li></ul><ul><li>Re-indexar para un buscador </li></ul><ul><li>O... </li></ul>
  16. 16. Quitar de la request <ul><li>Envío de emails </li></ul><ul><li>Actualizar datos desnormalizados </li></ul><ul><li>Re-calcular estadísticas </li></ul><ul><li>Re-indexar para un buscador </li></ul><ul><li>Los tuits de @ justinbieber ;) </li></ul>
  17. 17. Arquitectura asíncrona <ul><li>JMS - Java Message Service </li></ul><ul><li>AMPQ - Advanced Message Queuing Protocol </li></ul><ul><li>Jabber </li></ul><ul><li>java.util.concurrent </li></ul><ul><li>Quartz/Tareas CRON </li></ul>
  18. 18. Grails PLugins <ul><li>JMS: http://grails.org/plugin/jms </li></ul><ul><li>RabbitMQ: http://grails.org/plugin/rabbitmq </li></ul><ul><li>Jabber: http://grails.org/plugin/jabber </li></ul><ul><li>Quartz: http://grails.org/plugin/quartz </li></ul>
  19. 19. Buenas Prácticas en la Capa Web
  20. 20. Yahoo Performance Rules <ul><li>34 reglas (23 testeables con YSlow) </li></ul><ul><li>http://yhoo.it/sx01V9 </li></ul><ul><li>Entre 25% y 50% de mejora </li></ul>
  21. 21. 1. Minimize HTTP Requests <ul><li>Unir todo en sólo 1 CSS y 1 JS </li></ul><ul><li>Resources: http://grails.org/plugin/resources </li></ul><ul><li>Hacer sprites para minimizar carga de imágenes </li></ul>
  22. 22. 2. Use a Content Delivery Network <ul><li>Red de distribución de contenidos </li></ul><ul><li>Sirve el servidor más cercano </li></ul><ul><li>CDN Resources: http://grails.org/plugin/cdn-resources </li></ul>
  23. 23. 4. Add an Expires or a Cache-Control Header <ul><li>Los ficheros estáticos nunca expiran </li></ul><ul><li>Cached Resources: http://grails.org/plugin/cached-resources </li></ul><ul><li>Para el contenido dinámico: Cache-Control </li></ul><ul><li>Cache Headers: http://grails.org/plugin/cache-headers </li></ul>
  24. 24. 5. Gzip Components <ul><li>Comprimir los ficheros estáticos </li></ul><ul><li>Zipped Resources: http://grails.org/plugin/zipped-resources </li></ul>
  25. 25. 11. Minify JavaScript and CSS <ul><li>Limpia el código CSS y JS innecesario </li></ul><ul><li>YUI Minify Resources: http://grails.org/plugin/yui-minify-resources </li></ul>
  26. 26. Bola Extra <ul><li>3. Avoid empty src or href </li></ul><ul><li>6. Put StyleSheets at the Top </li></ul><ul><li>7. Put Scripts at the Bottom </li></ul><ul><li>8. Avoid CSS Expressions </li></ul><ul><li>9. Make JavaScript and CSS External </li></ul>
  27. 27. Bola Extra (2) <ul><li>12. Avoid Redirects </li></ul><ul><li>13. Remove Duplicate Scripts </li></ul><ul><li>14. Configure ETags </li></ul><ul><li>15. Make Ajax Cacheable </li></ul>
  28. 28. Q&A GRACIAS! [email_address]

×