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

Priča asinkronim Spring servletima o

  • 1.
    Priča asinkronim Springservletima o Karlo Novak, SV Group d.o.o. karlo.novak@svgroup.hr
  • 2.
    •Servleti •Asinkroni servleti,non-blocking IO •DefferedResult •Mjerenja •Non blocking API-i i alternative Sadržaj
  • 3.
    •Thread per request •Blokiranje threadova •Čekanje na odgovor (baze podataka, vanjskog web servisa, pisanja na disk...) •Neefikasno, neskalabilno •C10k problem Klasični servleti
  • 4.
    Asinkroni servleti •Omogućavajuasinkrone 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
  • 5.
    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
  • 6.
    •Springova apstrakcija asinkronihservleta •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
  • 7.
  • 8.
  • 9.
    Mjerenja i usporedbe(1. runda) •Blocking servleti •Asinkroni servleti 200 threadova
  • 10.
    Mjerenja i usporedbe(1. runda) •Asinkroni servleti 200 threadova •Blocking servleti
  • 11.
    Mjerenja i usporedbe(2. runda) •Blocking servleti X threadova •Asinkroni servleti
  • 12.
    Mjerenja i usporedbe(2. runda) •Blocking servleti X threadova •Asinkroni servleti
  • 13.
    •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
  • 14.
    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)
  • 15.
  • 16.
    Asinkroni servleti susuper 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
  • 17.
    A sad vi... karlo.novak@svgroup.hr