optimiza tus webs Grails <ul><li>Greach - Noviembre 2011 </li></ul><ul><li>Dani Latorre </li></ul>
¿Quién soy? <ul><li>Desarrollador web independiente </li></ul><ul><li>Jobsket, elDisparate, CachiruloValley... </li></ul><...
Velocidad <ul><li>La velocidad es una magnitud física de carácter vectorial que expresa el desplazamiento de un objeto por...
A mayor velocidad de respuesta <ul><li>Escalabilidad </li></ul><ul><li>Costes </li></ul><ul><li>SEO </li></ul><ul><li>UX <...
¿Cómo? <ul><li>Cuidar la base de datos </li></ul><ul><li>Minimizar operaciones en la request </li></ul><ul><li>Buenas prác...
Cuidar la Base de Datos
Acceso a bases de datos <ul><li>No guardar constantes </li></ul><ul><li>Desnormalizar </li></ul><ul><li>Contadores </li></...
Evitar N+1 <ul><li>fetch: ‘join’ </li></ul>class Comment{ Post post String author ... static mapping{ post fetch: ‘join’ }...
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>
Caché de segundo nivel <ul><li>read-only:  Datos de sólo lectura. </li></ul><ul><li>nonstrict-read-write:  Escenarios con ...
Caché de segundo nivel <ul><li>Clases de dominio y asociaciones </li></ul>class Post{ ... static hasMany = [comments: Comm...
Caché de consultas <ul><li>cache: true </li></ul>def groovyPosts = Post.findAllByTitle(“%Groovy%”, [cache:true]) def groov...
Spring Cache Plugin <ul><li>Cachear métodos de un Bean, incluso actions de Controllers </li></ul>@Cacheable(&quot;pirateCa...
Minimizar las Operaciones en la Request
Quitar de la request <ul><li>Envío de emails </li></ul><ul><li>Actualizar datos desnormalizados </li></ul><ul><li>Re-calcu...
Quitar de la request <ul><li>Envío de emails </li></ul><ul><li>Actualizar datos desnormalizados </li></ul><ul><li>Re-calcu...
Arquitectura asíncrona <ul><li>JMS - Java Message Service </li></ul><ul><li>AMPQ - Advanced Message Queuing Protocol </li>...
Grails PLugins <ul><li>JMS:  http://grails.org/plugin/jms </li></ul><ul><li>RabbitMQ:  http://grails.org/plugin/rabbitmq <...
Buenas Prácticas en la Capa Web
Yahoo Performance Rules <ul><li>34 reglas (23 testeables con YSlow) </li></ul><ul><li>http://yhoo.it/sx01V9 </li></ul><ul>...
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/re...
2. Use a Content Delivery Network <ul><li>Red de distribución de contenidos </li></ul><ul><li>Sirve el servidor más cercan...
4. Add an Expires or a Cache-Control Header <ul><li>Los ficheros estáticos nunca expiran </li></ul><ul><li>Cached Resource...
5. Gzip Components <ul><li>Comprimir los ficheros estáticos </li></ul><ul><li>Zipped Resources:  http://grails.org/plugin/...
11. Minify JavaScript and CSS <ul><li>Limpia el código CSS y JS innecesario </li></ul><ul><li>YUI Minify Resources:  http:...
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 Scr...
Bola Extra (2) <ul><li>12. Avoid Redirects </li></ul><ul><li>13. Remove Duplicate Scripts </li></ul><ul><li>14. Configure ...
Q&A GRACIAS! [email_address]
Upcoming SlideShare
Loading in …5
×

Optimiza tus webs Grails. Greach 2011

3,996
-1

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,996
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
30
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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]
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×