0

我目前正在开发我的第一个 vert.x 服务,但我对部署的实现方式并不十分自信。

我有几个 Verticle 来接受来自其他服务的请求并将一堆工作委托给其他 Verticle。如何在工作完成后启动每个任务的 Verticle 并杀死它,或者以编程方式将 Verticle 扩展为任务数量。

我目前在启动时生成了十个 Verticle,并使用事件总线将这些任务分布在 Verticle 上。

主垂直

class MainVerticle : CoroutineVerticle() {

  private val databaseConfig by lazy { config.getJsonObject("migration") }

  override suspend fun start() {
    vertx.deployVerticle(AdministrationVerticle::class.java, DeploymentOptions().setConfig(config))
    vertx.deployVerticle(UpdateVerticle::class.java, DeploymentOptions().setConfig(config))
  }
}

管理垂直 - HTTP 处理程序

private suspend fun handleRolloutRequest(ctx: RoutingContext) {
  val version = ctx.request().getParam("version")?.toInt() ?: findLatestVersion()
  val systems = findOutdatedSystems(version)

  for (system in systems) {
    vertx.eventBus().send("rollout", system.id, options)
  }

  ctx.response().end()
}

更新垂直

override suspend fun start() {
  client.connectAwait(mqttServerConfig.getInteger("port"), mqttServerConfig.getString("hostname"))

  vertx.eventBus().consumer<String>("rollout") {
    launch(vertx.dispatcher()) {
      // actual rollout
    }
  }
}
4

1 回答 1

1

deployVerticle将回调作为最后一个参数。此回调的结果是deploymentId

vertx.deployVerticle("your.class", res -> {
    if (res.succeeded()) {
        String deploymentID = res.result();
        ...
    }
}

从理论上讲,您可以在完成任务后使用它来取消部署您的 Verticle。

实际上,我会保持它们的数量不变,而是在容器级别进行扩展。

于 2020-02-28T12:55:53.250 回答