Archiv für den Monat: Januar 2016

Vert.x und der EventBus

Vert.x ist ein Framework zum Bauen von reaktiven Anwendungen. Eine zentrale Komponente ist der EventBus, über den Kommunikation zwischen den Komponenten des Systems abläuft. Der EventBus kann einerseits Events veröffenlichen (an viele Empfänger), oder mit einem Empfänger über einen Request/Response-Mechanismus kommunizieren.

Wenn mehrere Empfänger für eine Adresse registriert sind, und über den Request/Response-Mechanismus kommuniziert wird, dann bekommt ein Empfänger die Nachricht zugestellt.

If there is more than one handler registered at the address, one will be chosen using a non-strict round-robin algorithm.

Wie funktioniert das in der Praxis? Wie fair ist der Mechanismus? Ich habe dazu ein Beispiel geschrieben:

package net.modellierung.vertx;

import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.Timeout;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class EventBusTest {
 public static final String A_EVENT = "A";
 public static final int COUNT = 30;
 @Rule
 public Timeout timeout = Timeout.millis(18000);
 private Vertx vertx;

@Before
 public void setUp(TestContext context) {
   vertx = Vertx.vertx();
 }

@Test
 public void testEventReceiveFairness(TestContext context) {
 StringBuffer sb = new StringBuffer();
 Async eventsReceived = context.async(COUNT);
 vertx.eventBus().consumer(A_EVENT, event -> {
   sb.append("1");
   eventsReceived.countDown();
 });
 vertx.eventBus().consumer(A_EVENT, event -> {
   sb.append("2");
   eventsReceived.countDown();
 });
 for (int i = 0; i < COUNT; i++) {
   vertx.eventBus().send(A_EVENT, "");
 }
 eventsReceived.await();
 System.out.println(sb);
 }
}

Der Test registriert zwei Empfänger für ein Event, und sendet das Event dann COUNT mal. Die Empfänger schreiben dann eine 1 oder 2 in den StringBuffer. Am Ende wird der StringBuffer ausgegeben. Je nach Durchlauf wird eine andere Zeichenfolge ausgegeben.

Meine ersten beiden Durchläufe haben die Folgen „212222222222222211111111111111“ und „111111111111111222222222222222“ ergeben. Das ist eine gute Fairness.