Cache do lado do cliente no GWT

Temos um cliente gwt, que recebe muitos dados de nossos servidores. Logicamente, eu quero armazenar os dados em cache no lado do cliente, poupando o servidor de solicitações desnecessárias.

A partir de hoje, deixei para os meus modelos lidar com o armazenamento em cache de dados, que não é muito escalável. Ele também se tornou um problema, já que diferentes desenvolvedores de nossa equipe desenvolvem sua própria funcionalidade de “cache”, que inunda o projeto com duplicações.

Estou pensando em como alguém poderia implementar um “ponto de input único”, que lida com todo o cache, deixando os modelos sem noção sobre como o cache é tratado.

Alguém tem alguma experiência com o cache do lado do cliente no GWT? Existe uma abordagem padrão que pode ser implementada?

Eu sugiro que você procure no gwt-presenter e no CachingDispatchAsync . Ele fornece um único ponto de input para executar comandos remotos e, portanto, uma oportunidade perfeita para o armazenamento em cache.

Um post recente no blog descreve uma possível abordagem.

Você pode querer dar uma olhada no Padrão de Comando; Ray Ryan realizou uma palestra no Google IO sobre as melhores práticas no GWT, aqui está uma transcrição: http://extgwt-mvp4g-gae.blogspot.com/2009/10/gwt-app-architecture-best-practices.html

Ele propõe o uso do Padrão de Comando usando os objects Ação e Resposta / Resultado, que são lançados dentro e fora do proxy de serviço. Esses são objects excelentes para encapsular qualquer armazenamento em cache que você deseja executar no cliente.

Aqui está um trecho: “Eu tenho uma boa unidade de moeda para a implementação de políticas de cache. Pode ser sempre que eu ver a mesma solicitação GET duas vezes, vou esconder a resposta que recebi da última vez e apenas retornar isso para mim imediatamente. incomodar com uma viagem no lado do servidor “.

Em um projeto bastante grande, tomei outra direção. Eu desenvolvi um object DtoCache que essencialmente mantinha uma referência a cada AsyncCallback que estava esperando uma resposta de uma chamada de serviço em uma fila de espera. Depois que o DtoCache recebeu os objects do servidor, eles foram armazenados em cache dentro do DtoCache. O resultado em cache passou a ser retornado para todos os AsyncCallbacks recém-criados na fila para a mesma chamada de serviço.

Para um mecanismo de armazenamento em cache muito sofisticado e já construído para operações CRUD, considere o Smart GWT. Este exemplo demonstra a capacidade de fazer operações do lado do cliente de forma adaptável (quando o cache permite) enquanto ainda suporta paginação para grandes conjuntos de dados:

http://www.smartclient.com/smartgwt/showcase/#grid_adaptive_filter_featured_category

Esse comportamento é exposto através da class ResultSet se você precisar colocar seus próprios widgets sobre ele:

http://www.smartclient.com/smartgwtee/javadoc/com/smartgwt/client/data/ResultSet.html

Existem dois níveis de cache:

  • Armazenamento em cache durante uma session do navegador.
  • O armazenamento em cache de sessões cruzadas do navegador, por exemplo, os dados armazenados em cache devem estar disponíveis após o reinício do navegador.

O que armazenar em cache: depende do seu aplicativo, você pode querer armazenar em cache

  • Dados protegidos para determinado usuário
  • Dados estáticos públicos (ou semi-estáticos, por exemplo, raramente alterados)

Como fazer cache:

  • Para o primeiro nível de cache, podemos usar o código GWT conforme sugerido nas respostas ou escrever o seu próprio.
  • Para o segundo, devemos usar os resources de cache do navegador. A abordagem padrão é colocar seus dados dentro de html (se arquivos html estáticos ou dynamics gerados por jsp / servlet, por exemplo). Em seguida, seu aplicativo usa as técnicas http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html para obter os dados.

Eu achei que o Itemscript era legal. É um database JSON RESTful que funciona no cliente (GWT) e no servidor.

Confira!

-JP