vert.x - asinkroni skalabilni i poliglotni framework nove generacije
TRANSCRIPT
![Page 1: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/1.jpg)
Vert.x – asinkroni, skalabilni i poliglotni framework nove generacije
Mihovil RisterRazvojni inženjer
@ Pet Minuta d.o.o.
![Page 2: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/2.jpg)
Sadržaj predavanja
• Vert.x – što je to?• Karakteristike• Osnovne komponente • Arhitektura• Uporaba• Usporedba• Najbolje prakse• Zaključak
![Page 3: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/3.jpg)
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
![Page 4: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/4.jpg)
Vert.x – tko je to ?
Tim Foxhttp://vertx.io/
![Page 5: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/5.jpg)
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
![Page 6: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/6.jpg)
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
![Page 7: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/7.jpg)
Vert.x – Osnovne komponente
• Vertica (Verticle)
• Vert.x instanca
• (Distribuirana) sabirnica događaja (Event bus)
• Modul
![Page 8: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/8.jpg)
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)
![Page 9: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/9.jpg)
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
![Page 10: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/10.jpg)
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
![Page 11: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/11.jpg)
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
![Page 12: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/12.jpg)
Quad Core CPU
$vertx run Server.java –instances 4
Vert
.x in
stan
ce
Event Loops
JVM
inst
ance
Vert.x – Osnovne komponente -Vert.x instanca
![Page 13: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/13.jpg)
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)
![Page 14: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/14.jpg)
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 radnjemessage.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);
}});
Vert.x – Osnovne komponente – Event Bus
![Page 15: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/15.jpg)
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
![Page 16: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/16.jpg)
• Primjeri:– mod-mongo-peristor, mod-redis, mod-jdbc-persistor, mod-
postresql,...– 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-lang-
jruby, mod-lang-scala, mod-lang-coljure, ...
Vert.x – Osnovne komponente - Modul
![Page 17: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/17.jpg)
Vert.x – Arhitektura
![Page 18: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/18.jpg)
Vert.x – Arhitektura (distribuirana sab.)
![Page 19: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/19.jpg)
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.
![Page 20: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/20.jpg)
Vert.x – Arhitektura
• Primjer dijeljene mape
ConcurrentMap<String, Integer> map = vertx.sharedData().getMap("app.my-data");
map.put("key1", 123);map.putIfAbsent("key1", 123);map.replace("key1", 123, 124);map.get("key1");map.remove("key1");
![Page 21: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/21.jpg)
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");
![Page 22: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/22.jpg)
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
![Page 23: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/23.jpg)
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• ...
![Page 24: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/24.jpg)
Vert.x – Uporaba• Maven:<dependency>
<groupId>io.vertx</groupId><artifactId>vertx-core</artifactId><version>2.0.2-final</version>
</dependency> <dependency>
<groupId>io.vertx</groupId><artifactId>vertx-platform</
artifactId><version>2.0.2-final</version>
</dependency>
<dependency><groupId>io.vertx</groupId><artifactId>mod-mongo-persistor</artifactId><version>2.0.0-final</version>
</dependency>
mvn archetype:generate -Dfilter=io.vertx: -DgroupId=com.mycompany -DartifactId=my-module -Dversion=0.1
![Page 25: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/25.jpg)
Vert.x – UsporedbaVert.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
![Page 26: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/26.jpg)
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
![Page 27: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/27.jpg)
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)
![Page 28: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/28.jpg)
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.
![Page 29: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/29.jpg)
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
![Page 30: Vert.x - asinkroni skalabilni i poliglotni framework nove generacije](https://reader031.vdocuments.net/reader031/viewer/2022020715/55b6b6a7bb61eb796d8b456e/html5/thumbnails/30.jpg)
Kontakt
Mihovil RisterRazvojni inženjer,
Pet Minuta d.o.o.
gsm +385 91 5865 907
mail [email protected]
skype mihovil.rister
web http://www.fiveminutes.eu