Tag: java, vertx, reactive, event-loop, asynchronous, backend
Livello: intermedio
TL;DR: Toolkit reattivo e non bloccante su JVM basato su Event Loop, modello a verticle e messaggistica tramite EventBus.
Toolkit polyglot basato su Netty per applicazioni reattive non bloccanti.
Regola aurea: non bloccare mai il thread dell'Event Loop.
Modello a concorrenza multi-reattore con verticle a thread singolo isolato.
Verticle standard eseguito sempre sullo stesso Event Loop dedicato.
Worker Verticle per delegare operazioni bloccanti fuori dall'Event Loop.
executeBlocking permette l'esecuzione asincrona di codice legacy o I/O bloccante.
EventBus supporta pattern point-to-point, publish-subscribe e request-response.
Gestione asincrona tramite Future, Promise e composizione funzionale.
Scalabilita' elevata con basso consumo di risorse rispetto a thread-per-request.
Q: Come si gestisce un'operazione JDBC bloccante in Vert.x?
R: Uso executeBlocking o un Worker Verticle per delegare la chiamata a un pool dedicato senza bloccare l'Event Loop.
Q: Qual e' la differenza tra standard verticle e worker verticle?
R: Gli standard verticle girano su thread Event Loop; i worker verticle girano su thread worker pool separati per carichi bloccanti.
Q: Come comunicano i verticle tra loro in modo disaccoppiato?
R: Comunicano tramite l'EventBus scambiandosi messaggi asincroni con indirizzi stringa, supportando anche cluster distribuiti.
Eseguire chiamate bloccanti (Thread.sleep, I/O sincrono) dentro un verticle standard.
Condividere stato mutabile tra verticle senza serializzazione o EventBus.
Dimenticare di completare una Promise lasciando i Future appesi all'infinito.
Sovraccaricare il pool dei worker con troppi task bloccanti non dimensionati.
// Verticle HTTP non bloccante base
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
public class ServerVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) {
vertx.createHttpServer()
.requestHandler(req -> req.response().end("OK"))
.listen(8080)
.onSuccess(server -> startPromise.complete())
.onFailure(startPromise::fail);
}
}
Java
// Esecuzione di blocco senza fermare l'Event Loop
vertx.executeBlocking(() -> {
return queryDatabaseBloccante();
}).onSuccess(result -> {
req.response().end(result.toString());
});
[ ] Pattern di composizione Future.all() e Future.compose()
[ ] Configurazione del cluster manager (Hazelcast/Infinispan) per EventBus distribuito
[ ] Differenza tra Vert.x Web Router e server HTTP nativo
[x] Regola del non blocco dell'Event Loop