集群顶点的多个或单个实例

问题描述

我正在使用 vertx4 开发微服务,每个服务由多个 Verticle 组成,所有服务都使用以下代码部署为集群(hazelcast)verticle。

Vertx.clusteredVertx(options.setHAEnabled(isHa),(vertx) -> {
            ((Vertx)vertx.result()).deployVerticle(verticleName,(new DeploymentOptions()));
});

我正在为服务中的每个顶点调用上述代码,并创建了多个顶点对象或实例。

  1. 在集群中部署 Verticle 是否正确?
  2. 我应该从 clusteredVertx 获取一个 vertx 对象并使用它来部署多个 Verticle 吗?
  3. 拥有多个 vertx 实例的优点和缺点是什么?

我已经阅读了 vertx 文档,但我无法特别理解聚类。我什至检查了一些 vertx 源代码,例如 Launcher class,但没有任何帮助我得到答案。

解决方法

我认为您混淆了两个概念,一个是 Vertx 实例,另一个是聚类。

每个 Vertx 实例都有并管理自己的事件总线和自己的事件循环,最适合用于运行许多 Verticle。 Vertx 的一个实例完全有能力管理许多 Verticle,并允许它们通过一个事件总线相互通信。这就是并发模型。

当您需要在通常部署到不同 JVM 甚至机器的多个应用程序(= 多个 Vertx 实例)之间扩展和连接事件总线时,需要集群。

集群时,每个 Vertx 实例都有自己的事件总线,但是相互发现的实例(如何取决于集群技术)将桥接它们的事件总线,这意味着它们的 Vertx 会找到彼此。但是,此桥有其自身的成本,您不希望将其用于内部应用程序通信。

因此,如果您谈论的是一个应用程序,那么通常的方法是获取单个 Vertx 实例并将其用于部署所有 Verticle。 Verticle 本身不知道它是否安装在集群 Vertx 上。除了它可以显式挂载其处理程序仅用于本地使用 (vertx.eventBus().localConsumer(...)),这意味着即使在集群设置中,这些处理程序也不会响应来自其他实例的消息。

在一个应用程序中拥有多个 Vertx 实例并非不可能,但如果您不想将 Vertx 弯曲到其延伸范围,那么这不适合您。