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