3. Vert.x – što je to ?
•
•
•
•
•
•
•
Zapravo i nije framework, više kao platforma na JVM
Prva verzija u svibnju 2012. g. (Node.js, 2009. g.)
Inicijalno projekt zaposlenika VMwarea
8. 2013 - Eclipse Foundation (Incubating)
JDK 1.7 +
Jedan od najzanimljivijih projekata na GitHubu
Skalabilan, poliglotan, modularan, asinkron,
jednostavan
5. Vert.x – što je to ?
• Koji problem rješava?
• C10K !
• „It's time for web servers to handle ten thousand
clients simultaneously, don't you think? After all, the
web is a big place now.” Dan Kegel (2003.)
• Upravljanje i optimiranje resursima pri velikom broju
simultanih korisnika (konekcija).
• Thread po konekciji? Blokirajuće operacije?
• Vert.x - asnikrona i event driven arhitektura
6. Vert.x – Karakteristike
• Poliglotan (JS, Java, Python, Groovy, Ruby – Scala i
Clojure dolaze)
• Asinkron (zapravo event driven)
• Modularan (koristi module i može biti modul)
• Jednostavan (bez puno konfiguracije)
• Skalabilan (koristi sabirnicu za komunikaciju)
• Jednostavan model višenitnosti (multithreading,
Reactor pattern)
• Embedabilan i koristi sve prednosti JVM-a
7. Vert.x – Osnovne komponente
• Vertica (Verticle)
• Vert.x instanca
• (Distribuirana) sabirnica događaja (Event bus)
• Modul
8. Vert.x – Osnovne komponente - Vertica
•
•
•
•
Osnovna jedinica upravljanja (deploymenta)
Kod koji Vert.x izvršava
Izolirani ClassLoader
Ne mogu globalno dijeliti stanje (static, globalne
varijable,...)
• 2 tipa vertica:
1. Logička vertica - single threading – non blocking code
2. Radna vertica (Worker verticle) – može korisiti multithreading i
kod koji blokira (nije asinkron)
9. Vert.x – Vertica u Javi
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.platform.Verticle;
public class Server extends Verticle {
public void start() {
vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() {
public void handle(HttpServerRequest req) {
String file = req.path().equals("/") ? "index.html" : req.path();
req.response().sendFile("webroot/" + file);
}
}).listen(8080);
}
}
$vertx run Server.java
10. Vert.x – Vertica u Javi 8 + Lambda
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.deploy.Verticle;
public class Server extends Verticle {
@Override
public void start() throws Exception {
vertx.createHttpServer().requestHandler((HttpServerRequest req) -> {
String file = req.path.equals("/") ? "index.html" : req.path;
req.response().sendFile(file);
}).listen(8086);
}
}
$vertx run Server.java
11. Vert.x – Osnovne komponente - Vert.x instanca
• Jedna ili više vertica
• Radi u vlastitoj JVM instanci
• Više instanci na istom hostu (više hostova koji
komuniciraju putem distribuiranog Event busa)
• Garantirano: Vert.x instancu izvršava samo jedan
thread (singlethreading programiranje)
• Održava set threadova za:
– Event (Run) Loop (1 po CPU jezgri)
– thread pool za izvršavanje radnih vertica
12. Vert.x – Osnovne komponente -Vert.x instanca
Event Loops
Quad Core CPU
$vertx run Server.java –instances 4
13. Vert.x – Osnovne komponente – Event Bus
•
•
•
•
•
•
•
Živčani sustav Vert.x-a
Komunikacija između vertica (među procesna)
Zbilja jednostavan API
Pub/Sub, Req/Resp, PtoP načini prosljeđivanja poruka
JSON poruke za strukturirane podatke
Distribuirani: spaja Vert.x JVM instance
Do klijentske strane (npr. Browser + SocksJS ili Web
Socket)
• Nije perzistentan (in memory)
14. Vert.x – Osnovne komponente – Event Bus
import org.vertx.java.core.Handler;
import org.vertx.java.core.eventbus.EventBus;
...
Handler<Message<String>> myHandler = new Handler<Message<String>>() {
public void handle(Message<String> message) {
System.out.println("Primih poruku: " + message.body);
// izvrši neophodne radnje
message.reply(„Odgovor");
}
};
//----------------------------------------------------------------------------------------------------------------eb.registerHandler("test.address", myHandler);
eb.send("test.address", "Ovo je poruka", new Handler<Message<String>>() {
public void handle(Message<String> message) {
System.out.println("Primih odgovor: " + message.body);
}
});
15. Vert.x – Osnovne komponente - Modul
• Mod – upakirana Vert.x aplikacija
• Module koriste druge aplikacije ili drugi Vert.x sustavi
• Idealno za distribuciju putem Mavena (Nexus)
• Vert.x javni registar modula - http://modulereg.vertx.io/
• Busmod – modul koji komunicira preko EventBusa s
verticama putem JSON poruka.
• Moduli su preferiran način korištenja i embedanja Vert.x
aplikacija
16. Vert.x – Osnovne komponente - Modul
• Primjeri:
– mod-mongo-peristor, mod-redis, mod-jdbc-persistor, modpostresql,...
– mod-mailer, mod-session-manager, mod-auth-mgr
– mod-guice, mod-spring-appcontext
– mod-kafka, mod-jersey, mod-socketio
– mod-zip, mod-unzip, mod-ampq
• Jezici koje vert.x podržava su također moduli:
– mod-lang-rhino, mod-lang-groovy, mod-lang-jython, mod-langjruby, mod-lang-scala, mod-lang-coljure, ...
19. Vert.x – Arhitektura
• Dijeljenje podataka između vertica (Shared state):
• Vertice mogu djeliti nepromjenjive podatke (Immutabe)
• Sesija po Vert.x instanci
• Vert.x daje pristup Shared Map i Shared Set
• Samo jednostavni tipovi: brojevi, boolean, String i Buffer
• Bitno za npr. Cache, sinkronizacijsku logiku, otvorene
konekcije i sl.
21. Vert.x – Arhitektura
• Primjer dijeljenog seta
Set<String> set = vertx.sharedData().getSet("app.may-set");
set.add("Mihovil");
set.contains("Mihovil");
vertx.removeSet("app.may-set");
22. Vert.x – Arhitektura
• Concurrency model:
–
–
–
–
–
Multi-reactor pattern
Synchronised, volatile, locking
Single threaded kod po vertici
Hibridni multithreading (logička i worker vertica)
Izolirani ClassLoader i jedan thread/event loop za egzekuciju
• Asinkroni model programiranja:
– Event handleri
– Asinkroni API za filesystem i streamove
– Izmjena poruka putem sabirnice
23. Vert.x – Arhitektura
Vert.x interno koristi ove open source projekte:
• Netty 4.0 -> network IO
• JRuby -> Ruby engine
• Jython -> Python engine
• Mozilla Rhino -> JavaScript engine
• Hazelcast -> upravljanje grupama i klasterom
• Jackson -> za JSON
• ...
25. Vert.x – Usporedba
Vert.x
Node.js
Polyglot
JavaScript
Lakoća skaliranja i klasteriranja
Nije tako lako skalirati
Skromniji broj modula
Velik broj modula
Dobra dokumentacija
Dobra dokumentacija
Bolje perfromanse
Ne tako dobre performanse (u odnosu na
Java vert.x)
Malo primjera uporabe
Puno primjera uporabe
Mali community
Velik community
Lakše uključivanje u Java projekte i
iskorištavanje Java ekosustava
Nije često korišten za enterprise sustave
26. Vert.x – Usporedba
• Programerska perspektiva :
– Dobre stvari:
•
•
•
•
•
JAVA !
Jednostavan i neopširan API
Timovi za razvoj u raznim jezicima
Zero conf. debugiranje i testiranje (podrška za integracijske testove)
Container API (programsko deplojanje i undeplojanje te logiranje)
– Ne tako dobre:
• Dosta anonimnih unutarnjih klasa (Lambdas to the rescue!)
• Nativne extenzije na drugim platformama na koje su ljudi navikli
• Nezgodno debugiranje busmoda (stack trace završava kod izmjene
poruka)
• Nema (out of the box) MVC podršku
• JDK7+ pa nema Androida
27. Vert.x – Najbolje prakse
•
•
•
•
•
•
•
•
•
Don’t block the event loop!
Java za razvoj (najbolje performanse)
Dobar alat za određene vrste poslova, ne sve.
Poštedno korištenje worker vertica.
Koristiti asinkrone java biblioteke (ako je moguće)
JCA adapter za integraciju s J2EE
Koristiti i dijeliti module (javni registar)
Autodeploy kod razvoja, no možda ne i u produkciji
Pratiti mrežni promet na hostu (tuniranje performansi)
28. Vert.x – Nabolje preporuke
• Koristiti za:
– „Real time” aplikacije (gdje biste i Node.js)
– Integraciju sa sustavima baziranim na messaging arhitekturi
(AMPQ, ZeroMQ, ...)
– Dashboardi i vezani API (big data)
– Message brokeri
– Push sustavi (push notifikacije za mobile)
– Veliki, particionirani cache sustavi
– Nadgledanje i upravljanje jobovima (Quartz, Jenkins, Hadoop)
– RPC sustavi, ad-hoc upiti nad velikim datasetovima
– Streaming podataka, audio-video, on the fly transformacije pod.
29. Vert.x – Zaključak
• Open source governance je bitan !
• Projekt je još mlad i u razvitku
• Nedostaje pravih, kompleksnih primjera
primjene u produkciji
• I u Java svijet dolaze nove vrste platforma, za
moderne izazove
• Poliglotnost: izrada kompleksnih modernih
enterprise sustava
30. Kontakt
Mihovil Rister
gsm
+385 91 5865 907
Razvojni inženjer,
mail
mihovil.rister@fiveminutes.eu
Pet Minuta d.o.o.
skype
mihovil.rister
web
http://www.fiveminutes.eu