42
1 Servlets 3 e o AJAX PUSH (com demo!) Paulo Silveira [email protected] @paulo_caelum

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

  • Upload
    caelum

  • View
    5.264

  • Download
    0

Embed Size (px)

Citation preview

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

1

Servlets 3 e o AJAX PUSH (com demo!)

Paulo [email protected] @paulo_caelum

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

eu já sei fazer ajax! uso JQuery!

foco no servidor!

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

além do tradicional, o PUSH

ajax reverso

cometstreaming

ajax push

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

clássico: ticker da bolsa

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

o que acontece com muitas atualizações?

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

muitos “pings/short poolings”

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

mantemos conexão aberta!

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

mantemos conexão aberta!

atualizações podem ser automáticasquando PETR4 mudar

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

Como implementar o push no servidor?

Como implementar o push no cliente?

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

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

1. Loop infinito (doPost)

for (BlockingQueue<String> queue : clients) { queue.add(mensagem); }

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

quais os problemas do loop infinito?

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

quais os problemas do loop infinito?

thread-per-request

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

quais os problemas do loop infinito?

thread-per-request

blocante

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

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

200

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

thread per connectionX

thread per request

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

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

Como deixar as outras threads (+200) em espera?

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

2001java.nio: IO não blocante

tecnologia já pré-histórica

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

selectors1 thread cuida de n channels

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

Http11NioProtocol

thread per request

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

tomcat 7 e maxthreads = 3000Apostam em quanto?

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

Como implementar o push no servidor?

Servlets 3 permite liberar a thread

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

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

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

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

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

AsyncContext + Jetty8 Baposta em quanto?

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

Tomcat 6+

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

Jetty 6+ continuations

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

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

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

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

AsyncContext

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

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

não blocante

AsyncContext

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

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

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

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

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