Aplicação Grails de exemplo de uso de técnicas para melhor performance.
Groovy JavaScript
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.settings
grails-app
scripts
src/groovy/org/gperform/events
test/unit/org/gperform
web-app
.classpath
.project
README
application.properties
com.springsource.sts.grails.core.prefs
org.codehaus.groovy.eclipse.preferences.prefs
org.eclipse.wst.common.project.facet.core.xml

README

----------------
Descrição
----------------

Esta é uma aplicação de exemplo em Grails que aplica técnicas que provilegiam performance. Utiliza diversos plugins como springcache, cache-headers, resources, cached-resources, zipped-resources, spring-events, e outros. Além dos plugins, utiliza a técnica sugerida por Burt Beckwith para a não utilização de collections nas relações many-to-many e many-to-one. E por último, utiliza algumas técnicas sugeridas por Peter Ledbrook na apresentacção "Tuning Your Grails Applications" (tem no youtube).

----------------
O que tem aqui?
----------------

Esta aplicação utiliza plugins e técnicas para melhorar a performance de uma aplicação Grails.

----------------
Plugins
----------------
- springcache: usado para fazer cache actions de controllers. Ao invés de executar a action toda novamente, acessar o banco de dados, etc, a resposta vem do cache e nada é executado na action que tiver configurada com o cache.

- spring-events: usado para executar tarefas assíncronas. Quando o usuário faz upload de uma foto, ao invés de criar a foto principal com 800px, o thumbnail maior com 150px, e o menor com 50px na hora do Request, cria-se esta imagens depois, de forma assíncrona. Um evento é lançado, e um FotoService é um listener desse evento, então é executado depois, assíncronamente (mas é muito rápido -- às vezes termina antes do request voltar).

- resources: usado para gerenciar os arquivos CSS e JS da aplicação. Este plugin junta (bundle) os arquivos CSS em um só, junta os JS em um só, e se encarrega de incluir o CSS no header do html, e incluir o JS no final do documento, última coisa antes do </body>. Só não faz o minify ainda, mas em breve....

- cached-resources: usado para renomear os arquivos CSS e JS, e incluir headers para que estes arquivos estáticos sejam guardados em cache pelo browser do usuário.

- zipped-resources: usado para gzippar os arquivos estáticos e diminuir assim seus tamanhos para serem enviados para o browser do usuário.

- cache-headers: plugin utilizado por outro plugin (cached-resoruces). Ele cria headers para fazer cache de arquivos estáticos. Mas vc pode usar para criar headers de cache para suas actions (assim seu site fica em cache no browser do usuario pelo tempo que vc determinar). Funciona muito bem.

- jquery: este não percisa falar muito né. Mas uso como plugin pois ele já expõe os módulos para o resources-plugin

- jquery-ui: plugin para incluir o jQuery UI

- blueprint: plugin para incluir o framework de CSS Blueprint.


------------------------
Técnicas Utilizadas
------------------------

- Uso de classes de relacionamento ao invés de usar os relacionamentos nativos do Grails. 
Ao invés de ter uma relação many-to-many entre duas classes, cria-se uma terceira classe no meio, de relacionamento, com duas relações many-to-one. Isso é até bom por um lado, pois permite que futuramente a relação tenha atributos e se torne uma entidade mais forte também. No banco de dados não muda nada, pois usa-se uma composite-id para criar a tabela de relacionamento com as duas chaves estrangeiras sendo a chave primária da relação.

- Processamento Assíncrono
Ao invés de processar fotos no momento do Request, de forma síncrona, uso o Spring-Events plugin para lançar um evento do tipo FotoSubidaEvent. Do outro lado tem um FotoService que é um Listener deste tipo de evento, e então ele é executado para processar as imagens.

- Cache de action
Uso o @Cacheable do Springcache plugin para colocar o resultado de uma action em cache. Aí o FotoService possui um método anotado com @CacheFlush para matar o cache quando uma nova foto é processada.

-------------------------
Passo a passo
-------------------------

Se fizer um clone deste repo e executar locamente o GPerform, tem um usuário "eumesmo" e senha "1234" pra vc iniciar a brincadeira. Mas precisará configurar o diretório das fotos no Config.groovy (TODO: melhorar esta descricao)

-------------------------
PS.
-------------------------
Além disso, como esta é uma aplicação para performance, eu coloquei as fotos sendo servidas diretamente por um Apache. Não é o tomcat que serve as fotos, ok?