当前位置: 首页 > 知识库问答 >
问题:

Vertx的netty事件循环仅使用单线程

唐弘益
2023-03-14

顶点似乎只由单个线程执行,并且总是由同一个线程执行。但是Vert. x能够通过每个CPU创建一个线程来使用机器中的所有CPU。每个线程可以向多个顶点发送消息。

但在性能测试期间,在标准verticle上评测Vertex http服务器时,我只能看到一个线程处理所有处理(vert.x-eventloop-thread-0)。

我该怎么做才能让我的8个事件循环线程都处理到verticle的消息?

CountDownLatch latch = new CountDownLatch(1);
final List<Throwable> errors = new ArrayList<>();

local = new Local(getVertx(), settings, options, connectionHandler, exceptionHandler);

LocalVerticle.vertxDeployMap.put(local.hashCode(), local);

DeploymentOptions dop = new DeploymentOptions()
        .setInstances(new VertxOptions()
        .getEventLoopPoolSize())
        .setConfig(new JsonObject().put("local", local.hashCode()));

Network.getVertx().deployVerticle(LocalVerticle.class.getName(), dop, (event) -> {
    if (!event.failed()) {
        latch.countDown();
    } else {
        errors.add(event.cause());
    }
});

boolean await = latch.await(10, TimeUnit.SECONDS);
if (!await) {
    if (errors.isEmpty()) {
        throw new Exception("Failed to initialize Local Verticle");
    } else {
        throw new Exception("Failed to initialize Local Verticle", errors.get(0));
    }
}

LocalVerticle.vertxDeployMap.remove(local.hashCode());


public class LocalVerticle extends AbstractVerticle {

    static final Map<Integer, Local> vertxDeployMap = new HashMap<>();
    
    private HttpServer httpServer;

    @Override
    public void start() throws Exception {
        
        Local local = vertxDeployMap.get(this.config().getInteger("local"));

        HttpServerOptions options = local.getOptions();
        Handler<HttpConnection> connectionHandler = local.getConnectionHandler();
        Handler<Throwable> exceptionHandler = local.getExceptionHandler();
        Router router = local.getRouter();

        this.httpServer = this.vertx
                .createHttpServer(options)
                .exceptionHandler(exceptionHandler)
                .connectionHandler(connectionHandler)
                .requestHandler(router)
                .listen();

    }

    @Override
    public void stop() throws Exception {
        if (this.httpServer != null) {
            this.httpServer.close();
            this.httpServer = null;
        }
    }
}

共有1个答案

法浩壤
2023-03-14

垂直面。x线程模型的设计使已部署垂直体的特定实例始终锁定到单个线程。为了跨核心扩展应用程序,您需要部署Verticle的多个实例。

使用verticle名称部署verticle时,可以指定要部署的verticle实例数:

DeploymentOptions options = new DeploymentOptions().setInstances(16);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

这对于跨多个核轻松扩展非常有用。例如,您可能要部署一个web服务器垂直站点,并且计算机上有多个核心,因此您希望部署多个实例以利用所有核心。

 类似资料:
  • 请说明当netty server和netty client连接成代理时,请求、线程、eventloop、服务器通道和客户端通道之间的关系。在开始之前,我认为对于每个请求,netty服务器都会从获取一个工作线程,以及一个(绑定到工作线程,使用线程池中有限的对象ID)来处理该入站消息,并将其发送到来自netty客户端的出站。此后,可能的服务器<代码>频道受到限制,而客户端<代码>频道受到限制(因为出站

  • 我来自一个请求=一个线程的概念,现在我想使用来理解事件循环的概念。根据文档,如果我们使用阻塞操作,我们应该将其传递给方法。 我有一些问题与这一段从 这是我的代码: 我向 http 服务器发送 100 个请求,这是输出: 1) 事件循环如何在请求之间切换(从输出中,它首先得到一些请求,然后给出响应)? 2)我使用了< code>executeBlocking方法,但是您可以看到上面的代码只使用了名为

  • 我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现

  • 问题内容: 首先,我开始尝试了解什么是Node.Js。我有两个问题。 第一个问题 从文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。 然后,考虑以下代码(从nodejs官方网站复制) 如果同时收到两个客户端请求,则意味着以下工作流程: 收到第一个http请求事件,收到第二个请求事件。 收到第一个事件后,将立即执行第一个事件的回调函数。 同

  • 我用Vert。xv3。5.1. 下面是最简单的代码示例: 在我的例子中,事件循环组的大小是16,所以我预计我的请求将影响16个线程。服务器已成功启动,但只能在一个线程中运行。(我使用不同的tcp连接发送了请求,所以保持活动状态不是原因。) 类包含,此管理器处理一组事件循环(名为)。在调试期间,我看到这个池只包含一个工人。 使用VerentleModel并不能解决这个问题,仍然不能使用所有的线程。

  • 我们已经实现了对Netty事件循环队列的监控,以便了解我们的一些Netty模块的问题。监视器使用方法,该方法适用于大多数模块,但对于每秒处理几千个HTTP请求的模块,它似乎被挂起,或者非常慢。我现在意识到文档严格指定这可能是一个问题,我觉得很差劲…所以我正在寻找另一种方法来实现这个监视器。 您可以在此处看到旧代码:https://github.com/outbrain/ob1k/blob/6364