1. Visão geral
Em aplicações Web, a geração de alguns relatórios pode demorar muito para o banco de dados calcular; alguns sites fornecem informações meteorológicas, o que requer acesso a um servidor remoto para fazer uma chamada SOAP para obter informações de temperatura. Todos estes são exemplos de informações complexas. Adicionar muitas informações complexas a uma página da Web pode sobrecarregar o servidor da Web e o servidor de banco de dados. O buffer de bloco de código JSP dá aos desenvolvedores a liberdade de adicionar todos os tipos de informações complexas à vontade.
JSP pode encapsular e executar código Java complexo na biblioteca de tags, o que torna os arquivos de páginas JSP mais fáceis de manter e torna mais conveniente para desenvolvedores não profissionais usar arquivos de páginas JSP. Já existem muitas bibliotecas de tags, que são produtos comerciais ou produtos de código aberto. Mas a maioria desses produtos usa bibliotecas de tags apenas para implementar funções que podem ser implementadas com um simples Java Scriptlet. Poucos produtos usam tags personalizadas de alguma forma criativa, fornecendo quase a mesma funcionalidade antes do surgimento das bibliotecas de tags personalizadas JSP.
A biblioteca de tags OSCache, projetada pela OpenSymphony, é um aplicativo inovador de tags personalizadas JSP que fornece cache de memória rápido em páginas JSP existentes. Embora existam alguns fornecedores que oferecem produtos de cache em diversas formas, todos eles são produtos específicos do fornecedor. OSCache pode ser executado em qualquer servidor compatível com JSP 1.1 e pode armazenar em cache blocos de código JSP existentes não apenas para todos os usuários, mas também por usuário. OSCache também inclui alguns recursos avançados para melhorar a escalabilidade, como buffer para disco, liberação de buffer programável, controle de exceções, etc. Além disso, como outros produtos OpenSymphony, o código do OSCache é distribuído gratuitamente sob uma licença de código aberto.
Este artigo toma como exemplo um processo de design de site de leilão imaginário para apresentar o processo de trabalho do OSCache. Este site imaginário incluirá: uma página de gerenciamento que relata atividades recentes de leilões; uma página inicial totalmente funcional com diversas informações promocionais e uma barra de navegação especial que contém informações sobre todas as atividades de leilão não resolvidas do usuário;
2. Página de gerenciamento
O site de leilões contém um relatório de gerenciamento e leva vários segundos para que o servidor de banco de dados crie tal relatório. É importante que o relatório demore muito para ser gerado, pois podemos ter vários administradores monitorando o funcionamento do sistema, e queremos evitar a regeneração do relatório toda vez que o administrador nos visitar. Para conseguir isso, encapsularemos a página inteira em uma tag de buffer no nível do aplicativo que é atualizada a cada hora. Alguns produtos de outros fornecedores têm funcionalidades semelhantes, mas o OSCache faz isso melhor que eles.
Por uma questão de simplicidade, não nos concentraremos muito em questões de formatação. Ao escrever a página de gerenciamento, primeiro adicionamos a declaração da biblioteca de tags à página:
<%@ taglib uri="cachetags" prefix="cache" %>
Em seguida, temos que cercar a página inteira com tags de cache. O tempo de cache padrão para tags de cache é de 1 hora.
<cache:cache> .... Relatórios de gerenciamento complexos.... </cache:cache>
A página de gerenciamento agora foi armazenada em cache. Se o administrador acessar a mesma página novamente dentro de uma hora após a geração da página, ele verá a página armazenada em cache anteriormente e não há necessidade de o servidor de banco de dados gerar este relatório novamente.
3. Página inicial
A página inicial do site de leilões exibe as atividades do site e promove leilões que estão prestes a terminar. Queremos exibir o número de leilões em andamento, o número de usuários logados no momento, uma lista de leilões que terminarão em um futuro próximo e o horário atual. Essas mensagens têm diferentes requisitos de precisão de tempo. Os leilões no site geralmente duram vários dias, então podemos definir o tempo para armazenar o número de leilões válidos em 6 horas. O número de usuários obviamente mudará com mais frequência, mas aqui armazenaremos esse valor em buffer por 15 minutos por vez. Por fim, queremos que a hora atual exibida na página seja sempre a hora exata em que a página foi acessada.
Depois de declarar a biblioteca de tags na página inicial, primeiro geramos a data atual diretamente sem buffer:
agora é: <%=new java.util.Date()%>
Em seguida, queremos exibir uma lista daqueles que serão Leilões que terminam no curto prazo:
<cache:cache> <ul> <% // Construa um Iterador contendo os leilões mais recentes Leilões do Iterador = .... while (auctions.hasMore()) { Leilão de leilão = (Leilão) leilões .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Finalmente, queremos exibir o número de atividades de leilão em andamento que esses números precisam. para ser tamponado por 6 horas. Como a marcação do cache requer o número de segundos para armazenar os dados em cache, convertemos 6 horas em 21.600 segundos:
<cache:cache time="21600"> <% //Consulte o banco de dados para obter o número total de atividades de leilão int leilãoCount = .. .. %> Existem <%=auctionCount%> leilões em andamento neste site </cache>
Como você pode ver, usamos apenas uma pequena quantidade de código para construir uma página inicial com um sistema de buffer complexo! Este sistema de buffer armazena cada parte da página separadamente, e o tempo de buffer de cada parte é totalmente consistente com a frequência de alterações em suas respectivas informações. Graças ao buffer, agora podemos colocar mais conteúdo na página inicial sem buffer antes, colocar muito conteúdo na página inicial tornará o acesso à página mais lento e pode até causar problemas ao servidor de banco de dados.
4. Barra de navegação
Suponha que ao planejar o site, decidimos exibir o conteúdo do carrinho de compras abaixo da barra de navegação esquerda. Mostraremos o número de lances e o preço atual de cada item em leilão pelo usuário, bem como uma lista de todos os itens para os quais o usuário atual tem o lance mais alto.
Usamos recursos de buffer em nível de sessão para construir a funcionalidade acima na barra de navegação. Coloque o seguinte código no modelo ou arquivo de inclusão para que outras páginas do site possam fazer referência a esta barra de navegação:
<cache:cache key="navbar" scope="session" time="300"> <% //Extrair e exibir as informações atuais do lance%> </cache:cache>
Aqui apresentamos dois atributos importantes, nomeadamente chave e escopo. No código anterior neste artigo, como a tag de cache pode criar automaticamente uma chave exclusiva para o bloco de código, não precisamos definir esse atributo de chave manualmente. Mas aqui, queremos fazer referência a esse bloco de código em cache do resto do site, por isso definimos explicitamente o atributo chave da tag de cache. Segundo, o atributo scope é usado para informar ao cache para marcar que o bloco de código atual deve ser armazenado em buffer por usuário, em vez de armazenar em buffer uma vez para todos os usuários.
Você deve ter muito cuidado ao usar o buffer no nível da sessão, e deve ficar claro: embora possamos fazer uma barra de navegação complexa reduzir a carga do servidor em 5x ou 10x, ela aumentará muito o espaço de memória necessário por sessão. É sem dúvida ideal aumentar o número de possíveis utilizadores simultâneos em termos de capacidades de CPU, mas uma vez que o número de utilizadores simultâneos é reduzido ao limite da CPU em termos de capacidades de suporte de memória, esta solução já não é ideal.
Conforme mencionado anteriormente neste artigo, queremos fazer referência a esse bloco de código em buffer do restante do site. Isso ocorre porque quando um usuário adiciona um item para leilão ou dá lances em itens leiloados por outros usuários, queremos atualizar o buffer para que a barra de navegação tenha o conteúdo mais recente na próxima vez que for lida. Embora esses dados possam mudar devido à atividade de outros usuários, pode ser muito confuso para um usuário ver que sua listagem permanece inalterada após realizar uma ação no site.
A tag flush fornecida pela biblioteca OSCache pode atualizar o conteúdo do buffer. Podemos adicionar o seguinte código à página que trata das ações do usuário e pode afetar esta área:
<cache:flush key="navbar" scope="session" />
Na próxima vez que o usuário acessar, o bloco de buffer da barra de navegação será atualizado .
Até agora, a construção do nosso site de amostra foi concluída e pode começar a funcionar. Vamos dar uma olhada nos recursos de tratamento de exceções do OSCache. Mesmo que o conteúdo armazenado em buffer tenha sido invalidado, como uma exceção Java ocorrendo dentro do bloco buffer, a biblioteca de tags OSCache ainda nos permite exibir o conteúdo programaticamente. Com esse recurso de controle de exceções, podemos interromper a conexão entre o servidor de banco de dados e o servidor web, e o site ainda poderá continuar funcionando. A especificação JSP 1.2 introduziu a interface TryCatchFinally, que permite que a própria tag detecte e manipule exceções Java. Portanto, a marcação pode ser combinada com esse código de tratamento de exceções para tornar as páginas JSP mais simples e organizadas.
OpenSymphony está planejando implementar mecanismos de buffer adicionais, bem como um sistema principal mais gerenciável que nos permitirá gerenciar a RAM e o espaço em disco usado pelo buffer. Assim que esses recursos estiverem implementados, poderemos melhorar ainda mais a capacidade de resposta e a confiabilidade do site.
[Conclusão]
OSCache pode nos ajudar a construir sites mais coloridos e de maior desempenho. Com a ajuda da biblioteca de tags OSCache, agora podemos utilizá-la para resolver alguns problemas que afetam a capacidade de resposta do site, como períodos de pico de tráfego, servidores de banco de dados sobrecarregados, etc.