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

垂直方向上的多实例垂直。x是线程安全的

元嘉木
2023-03-14

我知道,在vert. x中,默认的版本将在每次我们不需要在处理程序中写入线程安全时运行在相同的事件循环中。

例如,如果我有一个运行HttpServer的版本-

public class HttpServerVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
    vertx.createHttpServer().requestHandler(req -> {
        req.response().putHeader("content-type", "text/html").end(" 
    <html><body><h1>Hello from vert.x!</h1></body></html>");
    }).listen(8080);
}

}

可以保证,在任何时候,我的请求处理程序都会在两个事件循环上被调用两次(针对2个不同的请求)。因此,我不必在请求处理程序中处理线程安全问题。

如果我运行多个HttpServer顶点实例-

DeploymentOptions deploymentOptions = new 
        DeploymentOptions().setWorker(false).setInstances(10);

vertx.deployVerticle("com.....HttpServerVerticle", deploymentOptions);

我需要注意线程安全吗?多个请求处理程序(最大值=10)是否可能并行运行?

共有2个答案

司空丰
2023-03-14

从https://vertx.io/docs/4.2.0/vertx-core/java/#_specifying_number_of_verticle_instances:

使用顶点名称部署顶点时,可以指定要部署的顶点实例数。这对于跨多个内核轻松缩放非常有用。例如,您可能需要部署一个Web服务器顶点和计算机上的多个内核,因此您需要部署多个实例来使用所有内核。

我通过实验证实了这一点:对于verticle的多实例部署,所有实例的部署ID都是相同的。所有实例都是线程安全的。

演示代码:

public class Server extends AbstractVerticle {

  private static final Logger LOGGER = LoggerFactory.getLogger(Server.class);

  private int counter = 0;

  @Override
  public void start(Promise<Void> startPromise) throws Exception {
    vertx.createHttpServer().requestHandler(request -> {
      LOGGER.info("Request #{} from {}, verticleId: {}, hashcode: {}", ++counter, request.remoteAddress().host(), vertx.getOrCreateContext().deploymentID(), this.hashCode());
      request.response().end("Hello!");
    }).listen(8090).onComplete(server -> {
      if (server.succeeded()){
        startPromise.complete();
      }else {
        startPromise.fail(server.cause());
      }
    });
  }

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(Server.class, new DeploymentOptions().setInstances(4));
  }
}

public class Client {

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    WebClient webClient = WebClient.create(vertx);
    for (int i = 0; i < 100; i++) {
      webClient.getAbs("http://localhost:8090").send().onSuccess(response -> System.out.println(response.bodyAsString())).onFailure(Throwable::printStackTrace);
    }
  }
}

但是,这并不意味着您可以部署任何顶点的多个实例。因为多实例部署意味着生成多个顶点对象。如果顶点是有状态的,则多个实例对象的状态彼此独立。换句话说,如果在多实例部署期间需要在顶点中保持一致和共享的状态(如DEMO中的计数器),则不能进行多实例部署。或者,您可以使用vertx提供的共享数据来解决这个问题。

卢英叡
2023-03-14

在本例中,您得到的是10个垂直消息,HTTP请求将在这10个垂直消息中以循环方式发送。每个垂直线都将被分配到一个事件循环中,您将保持相同的线程安全保证。

 类似资料:
  • 我对Vert.x非常陌生,就像几天前一样。我来自一个JAX式的,安逸的世界。我可能大错特错,请指正。 我的问题是:如何使顶点公开自己的REST接口(子路由器),以及如何将其子路由器注册到应用程序的主路由器中? 我尝试过类似的东西,但是当我请求/产品/所有:( } }

  • 假设我有一个类似这样的竖线(有意简化以便于解释我的问题)。 现在想象一下,MyService是事件驱动的,当服务中发生某些事件时,我想停止顶点。 是否有人对Vert有更多经验。x知道如何做到这一点?或者,也许有人会给我一些建议,告诉我什么是正确的替代方法?

  • 我被vertx实例搞糊涂了。第一次看到文档时,我认为实例意味着事件循环线程的数量 当我深入研究源代码(vertx 2.1.2)时,我发现verticle实例意味着事件循环线程组中的一项任务。事件循环线程总是等待选择器并运行任务。 在vertx中有必要有顶点实例吗?因为顶点只由一个事件循环运行一次。更准确地说,事件循环线程运行Verentlestart方法并将其丢弃,它就像一个条目一样工作,仅此而已

  • 我有一个vert。x标准Verticle基本上,它解析HttpRequest并准备JsonObject,然后我通过事件总线发送JsonObject。在另一个Worker verticale中,该事件被消耗,并将启动执行(包括对Penthao数据集成Java API的调用),它正在阻止API。完成“.kjb”文件的执行大约需要30分钟。但是vert。x不断警告Worker线程块,所以我的问题是ver

  • 问题内容: 我一直在尝试使文本像我们在ms-word表中那样在垂直方向上移动,但到目前为止,我只能做到这一点 ……我不满意,因为它是一个旋转的盒子……是不是有没有办法获得实际的垂直方向文字? 我只在演示中将旋转设置为305度,这不会使文本垂直。会,但我只是制作了演示以显示旋转。 问题答案: 替代方法:http : //www.thecssninja.com/css/real-text-rotati

  • 我正在尝试为Vert开发概念验证。一款简单的实时浏览器游戏。 让我们想象一个类似于在线扑克的游戏——你有一个大厅,里面有许多你可以加入的现有游戏。你也可以创建一个新游戏(所以大厅里的游戏数量是可变的)。在这之前,你有一个异步超文本传输协议服务器(集群),玩家可以连接到它。尤其是在特定的游戏中,一切都是实时的,所以当玩家执行某个操作时,其他人会立即看到它,而无需刷新或定期ajax轮询。 我在考虑如何