【问题标题】:How to vertically scale Vert.x without Verticals?如何在没有垂直的情况下垂直缩放 Vert.x?
【发布时间】:2021-04-02 04:14:45
【问题描述】:

根据 Vert.x 文档 - 使用 Verticles 进行部署是 optional。如果是这种情况 - 我如何将 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, L:/0:0:0:0:0:0:0:1:8081 - R:/0:0: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:0:0:1:8081 - R:/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, L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:51002] 阅读:78B

【问题讨论】:

    标签: java vert.x event-loop vertx-verticle


    【解决方案1】:

    “可选”并不意味着“您可以,获得相同的好处”。 “可选”仅表示“您可以”。

    Vert.x 有线程关联的概念。从同一个线程创建的 HTTP Server 将始终分配给同一个事件循环。否则你会遇到令人讨厌的线程安全问题。

    您可以将上面的示例代码与以下代码进行比较:

            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
    

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

    【讨论】:

    • 所以你是说不使用 Verticles 就不可能编写多线程的 Vertx 代码?我也不清楚线程亲和力与此有什么关系?我在freecontent.manning.com/… 处读到了“可以从非 Vert.x 线程调用诸如 createHttpServer 或 setTimer 之类的准备方法”。
    • 我没有说这是不可能的。我说“你可以”。但是,你不会从中得到任何好处。我用一些代码示例更新了我的答案。
    • 这很有帮助 - 我试图了解垂直行业的工作原理,这可以澄清它。我想说将 Vertx 与现有的基于执行器的框架(如 Camel camel.apache.org/components/latest/…)集成是有好处的。
    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多