Resenha do artigo: Ajax for Java developers - Write scalable Comet applications with Jetty and Direct Web Remoting (Ajax Reverso)
Este artigo do Philip McCarthy faz uma sucinta revisão sobre ajax e suas restrições no servlet conteiner, e explica qual a estratégia adotada pelo servidor jsp Jetty. Também é explicado o que é o método Comet (coisa nova pra mim) e a utilização do Continuations API do servidor Jetty. Também é demonstrado como integrar essas funcionalidades com o DWR.
Ajax é, a um certo tempo, a buzzword do momento e que qualquer site que queria oferecer uma interação mais dinâmica do que uma mera leitura de páginas de revista no computador deve aprender seus fundamentos. O ajax pode simular a interação síncrona do browser com o servidor de 2 formas: criar um poll que é atualizado de tempos em tempos, trazendo evidenciando as atualizações ocorridas no servidor; ou manter a conexão http com o servidor aberta, repassando os dados conforme eles são atualizados, sendo esta última denominada de Comet.
A solução do Comet vem tentar resolver o seguinte problema: diversas conexões simultâneas perguntado por atualizações e o servidor respondendo na maioria das vezes "nada ainda". O recurso gasto para estabelecer e responder cada conexão acaba super onerando o servidor. Seria como uma pessoa que toma um taxi para o aeroporto e ficasse perguntando de 5 em 5's para o taxista "já chegamos?". Totalmente estúpido, não acham?
Mas infelizmente tudo não é tão fácil. Como cada conexão aberta consome uma Thread Servlet, acaba-se esgotando a memória do servidor rapidamente. Como a maior parte da latência das respostas http é consulta a disco (db, arquivos, etc.) ou rede (email, IM, busca), esta Thread acaba ficando ociosa, somente aguardando alguma interrupção do servidor para enviar alguma coisa, gastando a preciosa memória do servidor.
Jetty 6 & Continuations
Jetty 6 explora a java.nio, que permite otimizar a consulta e utilização de recursos de IO. O mecanismo de Continuations permite que o servidor lide com várias conexões http, suspendendo as Threads que somente estão aguardando algo acontecer. Se o tempo da suspensão passar, ou o método resume() for chamado, a Thread é realocada e continua sua execução.
DWR 2 & Ajax Reverso
Um conceito novo introduzido pelo DWR é o ajax reverso, que nada mais é que um determinado dado que é "empurrado" do servidor para o cliente, sem este dado ser solicitado. Isto é muito último principalmente em aplicações que requerem um certo nível de resposta em tempo real, como no caso de IM's.
O DWR utiliza 3 tipos de interação pelo ajax:
- a abordagem tradicional do pulling, ou seja, o cliente fica perguntado por atualizações de tempos em tempos
- a abordagem do pingback, que é uma aproveitar uma interação que o cliente irá fazer com o servidor e solicitar uma atualização dos dados. Com certeza este tipo de abordagem é a mais performática, mas é pouco útil no caso de clientes de IM's ou monitores (de log, por exemplo);
- finalmente temos o tipo Comet, que deixa a conexão aberta e vai enviando os dados conforme estes vão chegando.
O melhor de tudo é que o DWR detecta de forma transparente qual tipo de interação por ajax o cliente está utilizando.
Uma tabela comparativa de um benchmark executando uma aplicação web 2.0 que utiliza o método Comet demonstra o tamanho do ganho que se tem utilizando a técnica de tratamento de Threads do Jetty.
| Formula | Web 1.0 | Web 2.0 + Comet | Web 2.0 + Comet + Continuations |
Users | u | 10000 | 10000 | 10000 |
|
|
|
|
|
Requests/Burst | b | 5 | 2 | 2 |
Burst period (s) | p | 20 | 5 | 5 |
Request Duration (s) | d | 0.200 | 0.150 | 0.175 |
Poll Duration (s) | D | 0 | 10 | 10 |
|
|
|
|
|
Request rate (req/s) | rr=u*b/20 | 2500 | 4000 | 4000 |
Poll rate (req/s) | pr=u/d | 0 | 1000 | 1000 |
Total (req/s) | r=rr+pr | 2500 | 5000 | 5000 |
|
|
|
|
|
Concurrent requests | c=rr*d+pr*D | 500 | 10600 | 10700 |
Min Threads | T=c T=r*d | 500 - | 10600 - | - 875 |
Stack memory | S=64*1024*T | 32MB | 694MB | 57MB |
A solução Jetty 6 & DWR 2 parece como a mais inteligente para servidores que suportam este tipo de aplicação (como cliente de email, monitores de log, Im's), porque assim podem otimizar recursos e evitar overheads desnecessários.
artigo original: http://www.ibm.com/developerworks/java/library/j-jettydwr/index.html?ca=drs-
mais detalhes: http://www.webtide.com/downloads/whitePaperAjaxJetty.html
mais detalhes: http://alex.dojotoolkit.org/?p=545
0 comentários:
Postar um comentário