Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
-
Upload
caelum -
Category
Technology
-
view
5.264 -
download
0
Transcript of Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
![Page 2: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/2.jpg)
![Page 3: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/3.jpg)
eu já sei fazer ajax! uso JQuery!
foco no servidor!
![Page 4: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/4.jpg)
![Page 5: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/5.jpg)
além do tradicional, o PUSH
ajax reverso
cometstreaming
ajax push
![Page 6: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/6.jpg)
clássico: ticker da bolsa
![Page 7: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/7.jpg)
o que acontece com muitas atualizações?
![Page 8: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/8.jpg)
muitos “pings/short poolings”
![Page 9: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/9.jpg)
mantemos conexão aberta!
![Page 10: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/10.jpg)
mantemos conexão aberta!
atualizações podem ser automáticasquando PETR4 mudar
![Page 11: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/11.jpg)
Como implementar o push no servidor?
Como implementar o push no cliente?
![Page 12: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/12.jpg)
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(); }}
![Page 13: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/13.jpg)
1. Loop infinito (doPost)
for (BlockingQueue<String> queue : clients) { queue.add(mensagem); }
![Page 14: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/14.jpg)
quais os problemas do loop infinito?
![Page 15: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/15.jpg)
quais os problemas do loop infinito?
thread-per-request
![Page 16: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/16.jpg)
quais os problemas do loop infinito?
thread-per-request
blocante
![Page 17: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/17.jpg)
quais os problemas do loop infinito?
thread-per-request
blocante
aposta: quantos clientes no máximo?
![Page 18: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/18.jpg)
200
![Page 19: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/19.jpg)
thread per connectionX
thread per request
![Page 20: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/20.jpg)
thread per connectionX
thread per request
200 threads atendem quantos clientes?o que acontece com o 201o?
![Page 21: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/21.jpg)
Como deixar as outras threads (+200) em espera?
![Page 22: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/22.jpg)
2001java.nio: IO não blocante
tecnologia já pré-histórica
![Page 23: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/23.jpg)
selectors1 thread cuida de n channels
![Page 24: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/24.jpg)
Http11NioProtocol
thread per request
![Page 25: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/25.jpg)
tomcat 7 e maxthreads = 3000Apostam em quanto?
![Page 26: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/26.jpg)
Como implementar o push no servidor?
Servlets 3 permite liberar a thread
![Page 27: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/27.jpg)
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}
![Page 28: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/28.jpg)
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?
![Page 29: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/29.jpg)
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?
![Page 30: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/30.jpg)
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 } } }); }
![Page 31: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/31.jpg)
AsyncContext + Jetty8 Baposta em quanto?
![Page 32: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/32.jpg)
Tomcat 6+
![Page 33: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/33.jpg)
Jetty 6+ continuations
![Page 34: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/34.jpg)
Comparativo
Síncrono ~200-1263
Assíncrono Tomcat 1524
Assíncrono Jetty >5200?-20000
![Page 35: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/35.jpg)
Conclusão
o assíncrono é fundamental para a escalabilidade de um
sistema
há um preço
![Page 36: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/36.jpg)
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
![Page 37: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/37.jpg)
AsyncContext
https://github.com/peas/asyncservlets-test
![Page 38: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/38.jpg)
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
![Page 39: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/39.jpg)
mínimo de threads
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
![Page 40: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/40.jpg)
modelo um pouco mais difícil
mínimo de threads
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
![Page 41: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/41.jpg)
modelo um pouco mais difícil
mínimo de threads
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
único responsável pela palestra
![Page 42: Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira](https://reader033.fdocuments.net/reader033/viewer/2022050613/54b6af414a79599f7b8b45e4/html5/thumbnails/42.jpg)
Obrigado!
Visite:www.GUJ.com.br
www.tectura.com.brwww.agendatech.com.br
www.ProgramadorPoliglota.com.br
twitter: @paulo_caelum