如何在没有垂直轴的情况下垂直缩放vert.x?

qij5mzcb  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(322)

根据vert.x文档,使用verticles部署是可选的。如果是这样的话-我如何将http服务器部署到多个事件循环上?以下是我尝试的内容-也阅读了api文档,但找不到任何内容:

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,l:/0:0:0:0:0:1:8081-r:/0:0:0:0:0:1:50978]读取:78b
08:42:46.805[vert.x-eventloop-thread-0]调试io.netty.handler.logging.logginghandler-[id:0xe050d078,l:/0:0:0:0:0:1:8081-r:/0:0:0:0:0:1:51000]读取:78b
08:42:47.400[vert.x-eventloop-thread-0]调试io.netty.handler.logging.logginghandler-[id:0x22b626b8,l:/0:0:0:0:0:1:8081-r:/0:0:0:0:0:1:51002]读取:78b

iqxoj9l9

iqxoj9l91#

“可选”并不意味着“你可以,得到同样的好处”“可选”只是指“你可以”。
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

这是因为每个事件循环线程现在都绑定到一个单独的执行线程。

相关问题