Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Servlets 3 e o AJAX   Paulo Silveira                      paulo.silveira@caelum.com.br PUSH (com demo!)          @paulo_ca...
eu já sei fazer ajax! uso JQuery!                    foco no servidor!
além do tradicional, o PUSHajax 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<Stri...
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             blocanteaposta: quantos clientes no máximo?
200
thread per connection          X  thread per request
thread per connection            X    thread per request200 threads atendem quantos clientes?     o que acontece com o 201o?
Como deixar as outras threads (+200) em                espera?
2001 java.nio: IO não blocantetecnologia já pré-histórica
selectors1 thread cuida de n channels
Http11NioProtocolthread 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>();p...
2. AsyncContext (post)private BlockingQueue<String> messages = new                           LinkedBlockingQueue<String>()...
2. AsyncContext (o event loop)while (true) {	 	 String message = messages.take();	 	 for (AsyncContext ctx : clients) {	 	...
2. AsyncContext (o event loop)	   public void init() throws ServletException {	   	 Executors.newSingleThreadExecutor().ex...
AsyncContext + Jetty8 B  aposta em quanto?
Tomcat 6+
Jetty 6+   continuations
ComparativoSíncrono             ~200-1263Assíncrono Tomcat      1524Assíncrono Jetty    >5200?-20000
Conclusãoo assíncrono é fundamentalpara 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            ...
AsyncContexthttps://github.com/peas/asyncservlets-test
AsyncContext               não blocantehttps://github.com/peas/asyncservlets-test
AsyncContext               não blocante            mínimo de threadshttps://github.com/peas/asyncservlets-test
AsyncContext               não blocante            mínimo de threads       modelo um pouco mais difícilhttps://github.com/...
AsyncContext               não blocante            mínimo de threads       modelo um pouco mais difícil      único respons...
Visite:       www.GUJ.com.br     www.tectura.com.br   www.agendatech.com.brwww.ProgramadorPoliglota.com.br    twitter: @pa...
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Upcoming SlideShare
Loading in …5
×

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

5,261 views

Published on

Uma apresentação para conhecer umas das principais features do servlets 3; o asyncContext. bastante focada em conceitos, vamos utilizar o jetty 8 e o tomcat 7 para ver o impacto dessas decisões para fazer o ajax reverso/push.


Durante a apresentação também rodamos os códigos de exemplo para ver a brusca diferenca de se usar a abordagem assincrona em relacao ao thread-per-request/connection. codigo aqui:

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

Published in: Technology
  • Be the first to comment

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

  1. 1. Servlets 3 e o AJAX Paulo Silveira paulo.silveira@caelum.com.br PUSH (com demo!) @paulo_caelum 1
  2. 2. eu já sei fazer ajax! uso JQuery! foco no servidor!
  3. 3. além do tradicional, o PUSHajax reverso ajax push comet streaming
  4. 4. clássico: ticker da bolsa
  5. 5. o que acontece com muitas atualizações?
  6. 6. muitos “pings/short poolings”
  7. 7. mantemos conexão aberta!
  8. 8. mantemos conexão aberta!atualizações podem ser automáticas quando PETR4 mudar
  9. 9. Como implementar o push no cliente?Como implementar o push no servidor?
  10. 10. 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(); }}
  11. 11. 1. Loop infinito (doPost) for (BlockingQueue<String> queue : clients) { queue.add(mensagem); }
  12. 12. quais os problemas do loop infinito?
  13. 13. quais os problemas do loop infinito? thread-per-request
  14. 14. quais os problemas do loop infinito? thread-per-request blocante
  15. 15. quais os problemas do loop infinito? thread-per-request blocanteaposta: quantos clientes no máximo?
  16. 16. 200
  17. 17. thread per connection X thread per request
  18. 18. thread per connection X thread per request200 threads atendem quantos clientes? o que acontece com o 201o?
  19. 19. Como deixar as outras threads (+200) em espera?
  20. 20. 2001 java.nio: IO não blocantetecnologia já pré-histórica
  21. 21. selectors1 thread cuida de n channels
  22. 22. Http11NioProtocolthread per request
  23. 23. tomcat 7 e maxthreads = 3000 Apostam em quanto?
  24. 24. Como implementar o push no servidor? Servlets 3 permite liberar a thread
  25. 25. 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}
  26. 26. 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?
  27. 27. 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?
  28. 28. 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 } } }); }
  29. 29. AsyncContext + Jetty8 B aposta em quanto?
  30. 30. Tomcat 6+
  31. 31. Jetty 6+ continuations
  32. 32. ComparativoSíncrono ~200-1263Assíncrono Tomcat 1524Assíncrono Jetty >5200?-20000
  33. 33. Conclusãoo assíncrono é fundamentalpara a escalabilidade de um sistema há um preço
  34. 34. 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
  35. 35. AsyncContexthttps://github.com/peas/asyncservlets-test
  36. 36. AsyncContext não blocantehttps://github.com/peas/asyncservlets-test
  37. 37. AsyncContext não blocante mínimo de threadshttps://github.com/peas/asyncservlets-test
  38. 38. AsyncContext não blocante mínimo de threads modelo um pouco mais difícilhttps://github.com/peas/asyncservlets-test
  39. 39. AsyncContext não blocante mínimo de threads modelo um pouco mais difícil único responsável pela palestrahttps://github.com/peas/asyncservlets-test
  40. 40. Visite: www.GUJ.com.br www.tectura.com.br www.agendatech.com.brwww.ProgramadorPoliglota.com.br twitter: @paulo_caelum Obrigado!

×