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?
- 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.
| 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 |