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

Vertx';仅使用单个线程的netty事件循环,netty,vert.x,event-loop,Netty,Vert.x,Event Loop,一个垂直线程似乎只由一个线程执行,而且总是由同一个线程执行。 但是Vert.x能够通过为每个CPU创建一个线程来使用机器中的所有CPU。 每个线程都可以向多个垂直条发送消息 但在性能测试期间,在标准verticle上评测Vertex http服务器时,我只能看到一个线程处理所有处理(vert.x-eventloop-thread-0) 我该怎么做才能让我的8个事件循环线程都处理到verticle的消息 CountDownLatch latch = new CountDownLatch(1); f

一个垂直线程似乎只由一个线程执行,而且总是由同一个线程执行。 但是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;
        }
    }
}
CountDownLatch闩锁=新的CountDownLatch(1);
最终列表错误=新建ArrayList();
本地=新本地(getVertx(),设置,选项,connectionHandler,exceptionHandler);
LocalVerticle.vertxDeployMap.put(local.hashCode(),local);
DeploymentOptions dop=新的DeploymentOptions()
.setInstances(新的VertxOptions()
.getEventLoopPoolSize())
.setConfig(新的JsonObject().put(“local”,local.hashCode());
Network.getVertx().deployVerticle(LocalVerticle.class.getName(),dop,(事件)->{
如果(!event.failed()){
倒计时();
}否则{
errors.add(event.cause());
}
});
布尔等待=闩锁等待(10,时间单位秒);
如果(!等待){
if(errors.isEmpty()){
抛出新异常(“未能初始化本地垂直轴”);
}否则{
抛出新异常(“未能初始化本地垂直轴”,errors.get(0));
}
}
remove(local.hashCode());
公共类LocalVerticle扩展了AbstractVerticle{
静态最终映射vertxDeployMap=newHashMap();
专用HttpServer-HttpServer;
@凌驾
public void start()引发异常{
Local Local=vertxDeployMap.get(this.config().getInteger(“Local”);
HttpServerOptions=local.getOptions();
Handler connectionHandler=local.getConnectionHandler();
Handler exceptionHandler=local.getExceptionHandler();
路由器路由器=local.getRouter();
this.httpServer=this.vertx
.createHttpServer(选项)
.exceptionHandler(exceptionHandler)
.connectionHandler(connectionHandler)
.requestHandler(路由器)
.听();
}
@凌驾
public void stop()引发异常{
如果(this.httpServer!=null){
this.httpServer.close();
this.httpServer=null;
}
}
}

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

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

DeploymentOptions options = new DeploymentOptions().setInstances(16);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
这对于跨多个核轻松扩展非常有用。例如,您可能要部署一个web服务器垂直站点,并且计算机上有多个核心,因此您希望部署多个实例以利用所有核心


谢谢你的指点。这很有帮助。但是,在这个vertx上创建的http服务器并没有平等地使用所有已部署的垂直站点。有没有一种方法可以指示http服务器跨所有这些垂直站点进行扩展?您所说的“不平等地使用所有已部署的垂直站点”是什么意思?如果希望http服务器跨核心扩展,则必须部署创建http服务器的verticle的多个实例,并让所有实例将服务器绑定到同一端口。Vert.x足够聪明,可以在HTTP服务器的所有实例中循环请求。我向服务器发送请求,并在http服务器上的路由器上的处理程序中添加小的处理延迟,以影响事件循环线程的扩展。探查器仍然显示只有一个线程处理该处理。也许我们需要使用verticle类本身的start或init方法?我对您的代码有点困惑。您正在部署一个垂直体的8个实例,但它实际上似乎没有做任何事情。有没有你不想分享的代码?如果您只是在任何Verticle之外创建HttpServer的单个实例,那么所有端点的处理程序都将在单个线程中执行。为了使HttpServer的处理程序跨内核扩展,您必须在垂直链接内创建HttpServer(在其
start
方法中),并部署该垂直链接的多个实例。好的,我现在明白您的意思了。我将其设置为这样做,但很难将所需的参数(通过上下文)传递到垂直链接的启动函数(http服务器选项、路由器、处理程序)。看到AbstractVerticle上的成员上下文与我使用“getOrCreateContext”API创建的成员上下文不同。