javantura v2 - story asynchronous spring servlets about - karlo novak

Post on 05-Jul-2015

391 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

With an increasing number of connected devices on the Internet, handling of large number of concurrent requests in the applications becomes a priority. Traditional way of handling requests on a thread per request basis became an often encountered problem and a bottleneck for many high throughput services. Technology has therefore advanced to solve the problem by introducing asynchronous and non-blocking way of dealing with requests and processing. This session deals with Spring’s implementation based on asynchronous servlets for dealing with the mentioned issues.

TRANSCRIPT

Priča asinkronim Spring servletima o

Karlo Novak, SV Group d.o.o. karlo.novak@svgroup.hr

• Servleti

• Asinkroni servleti, non-blocking IO

• DefferedResult

• Mjerenja

• Non blocking API-i i alternative

Sadržaj

• Thread per request

• Blokiranje threadova

• Čekanje na odgovor (baze podataka, vanjskog web servisa, pisanja na disk...)

• Neefikasno, neskalabilno

• C10k problem

Klasični servleti

Asinkroni servleti

• Omogućavaju asinkrone obrade

• Čuvaju threadove iz web container poola

– Threadovi se vraćaju u container kod IO-a, IO odrađuju threadovi iz drugih poolova

• Preduvjet za korištenje non-blocking API-a

Non-blocking IO

• Sve “akcije” koje ne blokiraju thread koji ih poziva

• Rezultat obrađuju kroz Future, callback ili Observable (RxJava)

• Štednja threadova = štednja memorije i procesora (smanjuje context switching)

• Asinkrono + Non-blocking = Skalabilno

• Springova apstrakcija asinkronih servleta

• Pojednostavljuje rad s async contextom

• Zaprima objekt tipa “T” koji je konačni povratni rezultat Spring kontrolera

• Rezultat se vraća korisniku tek kada se u DeferredResult pohrani povratni objekt

DeferredResult<T> 1/3

DeferredResult<T> 2/3

DeferredResult<T> 3/3

Mjerenja i usporedbe (1. runda)

•Blocking servleti

•Asinkroni servleti

200 threadova

Mjerenja i usporedbe (1. runda)

•Asinkroni servleti

200 threadova

•Blocking servleti

Mjerenja i usporedbe (2. runda)

•Blocking servleti

X threadova

•Asinkroni servleti

Mjerenja i usporedbe (2. runda)

•Blocking servleti

X threadova

•Asinkroni servleti

• NIO štedi threadove

• Štednja CPU-a?

– 1000 threadova = ~10 000 ctxs/s

• Štednja memorije?

– 1000 threadova = inicijalno ~30MB

• NIO koristiti ako:

– su threadovi usko grlo

– broj threadova je iznimno velik i stvara značajnu razliku u potrošnji procesora i memorija (tisuće req/s)

Zaključak mjerenja

Non-blocking API-i

• SQL

– PostgreSQL (https://github.com/alaisi/postgres.async) ?

• HTTP klijenti

– https://github.com/AsyncHttpClient/async-http-client

• File IO

– Netty, Java NIO

• NOSQL

– MongoDB (http://www.allanbank.com/mongodb-async-driver/index.html)

– Infinispan (http://infinispan.org/docs/7.0.x/user_guide/user_guide.html#_asynchronous_api)

– Cassandra(http://www.datastax.com/documentation/developer/java-

driver/1.0/java-driver/asynchronous_t.html)

Non-blocking JVM alternative

Asinkroni servleti su super za određene use caseove, ali ne rješavaju magično sve probleme s performansama i ne poboljšavaju performanse sustava “sami od sebe”

Zaključak zaključka

A sad vi...

karlo.novak@svgroup.hr

top related