servlets 3: o contexto assíncrono - javaone 2010 - paulo silveira
TRANSCRIPT
eu já sei fazer ajax! uso JQuery!
foco no servidor!
além do tradicional, o PUSH
ajax reverso
cometstreaming
ajax push
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áticasquando PETR4 mudar
Como implementar o push no servidor?
Como implementar o push no cliente?
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 connectionX
thread per request
thread per connectionX
thread per request
200 threads atendem quantos clientes?o que acontece com o 201o?
Como deixar as outras threads (+200) em espera?
2001java.nio: IO não blocante
tecnologia já pré-histórica
selectors1 thread cuida de n channels
Http11NioProtocol
thread per request
tomcat 7 e maxthreads = 3000Apostam 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 Baposta 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
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
AsyncContext
https://github.com/peas/asyncservlets-test
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
mínimo de threads
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
modelo um pouco mais difícil
mínimo de threads
não blocante
AsyncContext
https://github.com/peas/asyncservlets-test
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
Obrigado!
Visite:www.GUJ.com.br
www.tectura.com.brwww.agendatech.com.br
www.ProgramadorPoliglota.com.br
twitter: @paulo_caelum