Согласно документации Vert.x, развертывание с использованием Verticles необязательно . Если это так, как я могу развернуть, скажем, HTTP-сервер на несколько циклов событий? Вот что я пробовал - также читал api docs и ничего не нашел:
Vertx vertx = Vertx.vertx(new VertxOptions().setEventLoopPoolSize(10));
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
for (int i = 0; i < 10; i++) {
vertx.createHttpServer(options).requestHandler(request -> {
request.response().end("Hello world");
}).listen(8081);
}
Кажется, это создает 10 HTTP-серверов в первом цикле событий, но я надеюсь на 1 сервер на цикл событий.
Вот что я вижу в своих логах — все eventloop-thread-0:
08:42:46.667 [vert.x-eventloop-thread-0] ОТЛАДКА io.netty.handler.logging.LoggingHandler — [id: 0x0c651def, Л:/0:0:0:0:0:0:0:1:8081 - Р:/0:0:0:0:0:0:0:1:50978] ЧТЕНИЕ: 78B
08:42:46.805 [vert.x-eventloop-thread-0] ОТЛАДКА io.netty.handler.logging.LoggingHandler — [идентификатор: 0xe050d078, Л:/0:0:0:0:0:0:0:1:8081 - Р:/0:0:0:0:0:0:0:1:51000] ЧТЕНИЕ: 78B
08:42:47.400 [vert.x-eventloop-thread-0] ОТЛАДКА io.netty.handler.logging.LoggingHandler — [id: 0x22b626b8, Л:/0:0:0:0:0:0:0:1:8081 - Р:/0:0:0:0:0:0:0:1:51002] ЧТЕНИЕ: 78B
«Необязательно» не означает «вы можете, получая те же преимущества». «Необязательно» означает просто «вы можете».
Vert.x имеет понятие сходства потоков. HTTP-сервер, созданный из одного и того же потока, всегда будет назначаться одному и тому же циклу событий. В противном случае вы получите неприятные проблемы с потокобезопасностью.
Вы можете сравнить приведенный выше пример кода со следующим кодом:
Vertx vertx = Vertx.vertx();
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
// Spawn multiple threads, so EventLoops won't be bound to main
ExecutorService tp = Executors.newWorkStealingPool(10);
CountDownLatch l = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
tp.execute(() -> {
vertx.createHttpServer(options).requestHandler(request -> {
System.out.println(Thread.currentThread().getName());
// Slow the response somewhat
vertx.setTimer(1000, (h) -> {
request.response().end("Hello world");
});
}).listen(8081);
});
}
// Just wait here
l.await();
Вывод примерно такой:
vert.x-eventloop-thread-0
vert.x-eventloop-thread-1
vert.x-eventloop-thread-2
vert.x-eventloop-thread-0
Это связано с тем, что каждый поток цикла событий теперь привязан к отдельному исполняющемуся потоку.
Я не говорил, что это невозможно. Я сказал "вы можете". Но никакой выгоды вы от этого не получите. Я обновил свой ответ некоторыми примерами кода.
Это полезно — я пытался понять, как работают вертикали, и это проясняет ситуацию. Я бы сказал, что интеграция Vertx с существующим фреймворком на основе исполнителя, таким как Camel camel.apache.org/components/latest/…, дает определенные преимущества.
То есть вы говорите, что невозможно написать многопоточный код Vertx без использования Verticles? Мне также не ясно, какое отношение к этому имеет сходство потоков? Я прочитал это «Методы подготовки, такие как createHttpServer или setTimer, могут быть вызваны из потока, отличного от Vert.x» здесь freecontent.manning.com/….