Как вертикально масштабировать Vert.x без вертикалей?

Согласно документации 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
377
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«Необязательно» не означает «вы можете, получая те же преимущества». «Необязательно» означает просто «вы можете».

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 без использования Verticles? Мне также не ясно, какое отношение к этому имеет сходство потоков? Я прочитал это «Методы подготовки, такие как createHttpServer или setTimer, могут быть вызваны из потока, отличного от Vert.x» здесь freecontent.manning.com/….

Charlie 26.12.2020 22:09

Я не говорил, что это невозможно. Я сказал "вы можете". Но никакой выгоды вы от этого не получите. Я обновил свой ответ некоторыми примерами кода.

Alexey Soshin 27.12.2020 11:15

Это полезно — я пытался понять, как работают вертикали, и это проясняет ситуацию. Я бы сказал, что интеграция Vertx с существующим фреймворком на основе исполнителя, таким как Camel camel.apache.org/components/latest/…, дает определенные преимущества.

Charlie 28.12.2020 16:05

Другие вопросы по теме