Upload
hujak-hrvatska-udruga-java-korisnika-croatian-java-user-association
View
394
Download
2
Embed Size (px)
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.
Citation preview
Priča asinkronim Spring servletima o
Karlo Novak, SV Group d.o.o. [email protected]
• 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...