Servlets 3 e o AJAX   Paulo Silveira
                      paulo.silveira@caelum.com.br
 PUSH (com demo!)          @paulo_caelum




                                      1
eu já sei fazer ajax! uso JQuery!

                    foco no servidor!
além do tradicional, o PUSH



ajax reverso                    ajax push
                         comet
        streaming
clássico: ticker da bolsa
o que acontece com muitas atualizações?
muitos “pings/short poolings”
mantemos conexão aberta!
mantemos conexão aberta!




atualizações podem ser automáticas
       quando PETR4 mudar
Como implementar o push no cliente?




Como implementar o push no servidor?
1. Loop infinito #ftw (doGet)
private Queue<BlockingQueue<String>> clients =
   new ConcurrentLinkedQueue<BlockingQueue<String>>();

protected void doGet(HttpServletRequest req,
                           HttpServletResponse response){
   BlockingQueue<String> messages = new LinkedBlockingQueue<String>();
	 clients.add(messages);

	   while (true) {
	   	 	 String message = messages.take();
	   	 	 PrintWriter writer = response.getWriter();
	   	 	 writer.println(message);	 	
    	 	 writer.flush();
	   }
}
1. Loop infinito (doPost)




        for (BlockingQueue<String> queue : clients) {
	   	   	 queue.add(mensagem);
	   	   }
quais os problemas do loop infinito?
quais os problemas do loop infinito?


  thread-per-request
quais os problemas do loop infinito?


  thread-per-request

       blocante
quais os problemas do loop infinito?


        thread-per-request

             blocante



aposta: quantos clientes no máximo?
200
thread per connection
          X
  thread per request
thread per connection
            X
    thread per request


200 threads atendem quantos clientes?
     o que acontece com o 201o?
Como deixar as outras threads (+200) em
                espera?
2001
 java.nio: IO não blocante
tecnologia já pré-histórica
selectors
1 thread cuida de n channels
Http11NioProtocol

thread per request
tomcat 7 e maxthreads = 3000
    Apostam em quanto?
Como implementar o push no servidor?




  Servlets 3 permite liberar a thread
2. AsyncContext (get)

private Queue<AsyncContext> clients = new
                     ConcurrentLinkedQueue<AsyncContext>();



protected void doGet(HttpServletRequest req,
                           HttpServletResponse response){
        AsyncContext ctx = req.startAsync();
	   	   ctx.setTimeout(3000000);
	   	   clients.add(ctx);
        // THREAD LIBERADA
}
2. AsyncContext (post)

private BlockingQueue<String> messages = new
                           LinkedBlockingQueue<String>();

protected void doPost(HttpServletRequest req,
                         HttpServletResponse arg1) {
	 	
	 	 messages.add(String.format("novo valor PETR4: %d %n",
	 	 	 	 contador.incrementAndGet()));
       // fazer o foreach aqui?
2. AsyncContext (o event loop)

while (true) {
	 	 String message = messages.take();
	 	 for (AsyncContext ctx : clients) {
	 	 	 PrintWriter writer = ctx.getResponse().getWriter();
	 	 	 writer.println(message);
	 	 	 writer.flush();
	 	 }
}



         quem roda essa loop?
2. AsyncContext (o event loop)

	   public void init() throws ServletException {
	   	 Executors.newSingleThreadExecutor().execute(new Runnable() {
	   	 	 // nosso reactor
	   	 	 public void run() {
	   	 	 	 while (true) {
	   	 	 	 	 	 // loop aqui! cuidado com blocante
	   	 	 	 }
	   	 	 }
	   	 });
	   }
AsyncContext + Jetty8 B
  aposta em quanto?
Tomcat 6+
Jetty 6+   continuations
Comparativo


Síncrono             ~200-1263

Assíncrono Tomcat      1524

Assíncrono Jetty    >5200?-20000
Conclusão

o assíncrono é fundamental
para a escalabilidade de um
          sistema

       há um preço
mas isso não vai te salvar do IE6


           Conclusão

  o assíncrono é fundamental
  para a escalabilidade de um
            sistema

          há um preço
AsyncContext




https://github.com/peas/asyncservlets-test
AsyncContext


               não blocante




https://github.com/peas/asyncservlets-test
AsyncContext


               não blocante


            mínimo de threads




https://github.com/peas/asyncservlets-test
AsyncContext


               não blocante


            mínimo de threads

       modelo um pouco mais difícil




https://github.com/peas/asyncservlets-test
AsyncContext


               não blocante


            mínimo de threads

       modelo um pouco mais difícil

      único responsável pela palestra


https://github.com/peas/asyncservlets-test
Visite:
       www.GUJ.com.br
     www.tectura.com.br
   www.agendatech.com.br
www.ProgramadorPoliglota.com.br




    twitter: @paulo_caelum

          Obrigado!

Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira

  • 1.
    Servlets 3 eo AJAX Paulo Silveira paulo.silveira@caelum.com.br PUSH (com demo!) @paulo_caelum 1
  • 3.
    eu já seifazer ajax! uso JQuery! foco no servidor!
  • 5.
    além do tradicional,o PUSH ajax reverso ajax push comet streaming
  • 6.
  • 7.
    o que acontececom muitas atualizações?
  • 8.
  • 9.
  • 10.
    mantemos conexão aberta! atualizaçõespodem ser automáticas quando PETR4 mudar
  • 11.
    Como implementar opush no cliente? Como implementar o push no servidor?
  • 12.
    1. Loop infinito#ftw (doGet) private Queue<BlockingQueue<String>> clients = new ConcurrentLinkedQueue<BlockingQueue<String>>(); protected void doGet(HttpServletRequest req, HttpServletResponse response){ BlockingQueue<String> messages = new LinkedBlockingQueue<String>(); clients.add(messages); while (true) { String message = messages.take(); PrintWriter writer = response.getWriter(); writer.println(message); writer.flush(); } }
  • 13.
    1. Loop infinito(doPost) for (BlockingQueue<String> queue : clients) { queue.add(mensagem); }
  • 14.
    quais os problemasdo loop infinito?
  • 15.
    quais os problemasdo loop infinito? thread-per-request
  • 16.
    quais os problemasdo loop infinito? thread-per-request blocante
  • 17.
    quais os problemasdo loop infinito? thread-per-request blocante aposta: quantos clientes no máximo?
  • 18.
  • 19.
    thread per connection X thread per request
  • 20.
    thread per connection X thread per request 200 threads atendem quantos clientes? o que acontece com o 201o?
  • 21.
    Como deixar asoutras threads (+200) em espera?
  • 22.
    2001 java.nio: IOnão blocante tecnologia já pré-histórica
  • 23.
  • 24.
  • 25.
    tomcat 7 emaxthreads = 3000 Apostam em quanto?
  • 26.
    Como implementar opush no servidor? Servlets 3 permite liberar a thread
  • 27.
    2. AsyncContext (get) privateQueue<AsyncContext> clients = new ConcurrentLinkedQueue<AsyncContext>(); protected void doGet(HttpServletRequest req, HttpServletResponse response){ AsyncContext ctx = req.startAsync(); ctx.setTimeout(3000000); clients.add(ctx); // THREAD LIBERADA }
  • 28.
    2. AsyncContext (post) privateBlockingQueue<String> messages = new LinkedBlockingQueue<String>(); protected void doPost(HttpServletRequest req, HttpServletResponse arg1) { messages.add(String.format("novo valor PETR4: %d %n", contador.incrementAndGet())); // fazer o foreach aqui?
  • 29.
    2. AsyncContext (oevent loop) while (true) { String message = messages.take(); for (AsyncContext ctx : clients) { PrintWriter writer = ctx.getResponse().getWriter(); writer.println(message); writer.flush(); } } quem roda essa loop?
  • 30.
    2. AsyncContext (oevent loop) public void init() throws ServletException { Executors.newSingleThreadExecutor().execute(new Runnable() { // nosso reactor public void run() { while (true) { // loop aqui! cuidado com blocante } } }); }
  • 31.
    AsyncContext + Jetty8B aposta em quanto?
  • 32.
  • 33.
    Jetty 6+ continuations
  • 34.
    Comparativo Síncrono ~200-1263 Assíncrono Tomcat 1524 Assíncrono Jetty >5200?-20000
  • 35.
    Conclusão o assíncrono éfundamental para a escalabilidade de um sistema há um preço
  • 36.
    mas isso nãovai te salvar do IE6 Conclusão o assíncrono é fundamental para a escalabilidade de um sistema há um preço
  • 37.
  • 38.
    AsyncContext não blocante https://github.com/peas/asyncservlets-test
  • 39.
    AsyncContext não blocante mínimo de threads https://github.com/peas/asyncservlets-test
  • 40.
    AsyncContext não blocante mínimo de threads modelo um pouco mais difícil https://github.com/peas/asyncservlets-test
  • 41.
    AsyncContext não blocante mínimo de threads modelo um pouco mais difícil único responsável pela palestra https://github.com/peas/asyncservlets-test
  • 42.
    Visite: www.GUJ.com.br www.tectura.com.br www.agendatech.com.br www.ProgramadorPoliglota.com.br twitter: @paulo_caelum Obrigado!

Notas do Editor

  • #2 \n
  • #3 arquiteto TEM de ser um bom programador\nno discurso do arquiteto, podemos ver que ele &amp;#xE9; quem programou a Matrix, com todas as regras.\n
  • #4 arquiteto TEM de ser um bom programador\nno discurso do arquiteto, podemos ver que ele &amp;#xE9; quem programou a Matrix, com todas as regras.\n
  • #5 \n
  • #6 \n
  • #7 \n
  • #8 \n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 \n
  • #13 \n
  • #14 \n
  • #15 \n
  • #16 \n
  • #17 \n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 \n
  • #23 \n
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 \n
  • #30 \n
  • #31 \n
  • #32 \n
  • #33 \n
  • #34 Na plataforma Java, essas s&amp;#xE3;o as dicas que podem ajudar bastante para flexibilizar seus tradeoffs. Interessante que s&amp;#xE3;o pr&amp;#xE1;ticas de implementa&amp;#xE7;&amp;#xE3;o e de design, que impactam na sua arquitetura.\n
  • #35 Na plataforma Java, essas s&amp;#xE3;o as dicas que podem ajudar bastante para flexibilizar seus tradeoffs. Interessante que s&amp;#xE3;o pr&amp;#xE1;ticas de implementa&amp;#xE7;&amp;#xE3;o e de design, que impactam na sua arquitetura.\n
  • #36 Na plataforma Java, essas s&amp;#xE3;o as dicas que podem ajudar bastante para flexibilizar seus tradeoffs. Interessante que s&amp;#xE3;o pr&amp;#xE1;ticas de implementa&amp;#xE7;&amp;#xE3;o e de design, que impactam na sua arquitetura.\n
  • #37 Na plataforma Java, essas s&amp;#xE3;o as dicas que podem ajudar bastante para flexibilizar seus tradeoffs. Interessante que s&amp;#xE3;o pr&amp;#xE1;ticas de implementa&amp;#xE7;&amp;#xE3;o e de design, que impactam na sua arquitetura.\n
  • #38 \n