Vert.x — Cheat Sheet

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.

Concetti chiave

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.

Domande tipiche e risposte pronte

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.

Insidie e errori comuni

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.

Snippet e comandi

// 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());
});

Da ripassare

[ ] 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

Jarvis Interviews
Jarvis