如何生成在完成工作后将被取消部署的 Verticles

How to spawn verticles that will be undeployed after they've done their work

我目前正在开发我的第一个 vert.x 服务,但我对我的部署实施方式不太有信心。

我有几个verticles接受来自其他服务的请求,并将一堆工作委托给其他verticle。我如何才能旋转每个任务的 Verticle 并在工作完成后终止它,或者以编程方式将 Verticle 扩展到任务数量。

我目前在启动时生成 10 个 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))
  }
}

Administration Verticle - 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
    }
  }
}

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

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

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

实际上,我会保持它们的数量不变,并改为在容器级别上扩展。