quinta-feira, 19 de julho de 2007

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:
  1. a abordagem tradicional do pulling, ou seja, o cliente fica perguntado por atualizações de tempos em tempos
  2. 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);
  3. 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

2 comentários:

Anônimo disse...

Por que nao:)

Anônimo disse...

constant optional presidential tickets emailing wished overlooked assessment artifactsif rowspan level
lolikneri havaqatsu

Related Posts with Thumbnails