Как я могу определить seed-узлы во время выполнения

У меня есть кластер akka с application.conf, как показано ниже:

 remote { // Remote configuration for this seed node
  enabled-transports = ["akka.remote.netty.tcp"]
  netty.tcp {
    hostname = ""
    port = 2555
  }
}
cluster {
  seed-nodes = [
    "akka.tcp://automation-akka-http@10.0.0.4:2555",
    "akka.tcp://automation-akka-http@10.0.0.5:2555"
  ] // Seed nodes of the cluster
  auto-down-unreachable-after = 10s
}

Прямо сейчас начальные узлы являются жестким кодом. Я хочу настроить параметр здесь так:

cluster {
  seed-nodes = [
    "akka.tcp://automation-akka-http@${?HOST1}:2555",
    "akka.tcp://automation-akka-http@${?HOST2}:2555"
  ] // Seed nodes of the cluster
  auto-down-unreachable-after = 10s
}

Я знаю, что могу определить эти параметры в команде sbt для компиляции. Но это не решит мою проблему, потому что у меня может быть только IP начальных узлов на этапе развертывания. Есть ли способ определить эти параметры при запуске.

1 ответ

Решение

Как объяснено в документации кластера Акка

Вы можете соединить начальные узлы программно с Cluster(system).joinSeedNodes,

В соответствии с документами Akka API требуется последовательность akka.actor.Address, которые будут адресами вашего начального узла.

Так что-то вроде этого должно работать:

val seeds = Seq(Address("akka.tcp", "RemoteSystem1", "host1", 1234),
                Address("akka.tcp", "RemoteSystem2", "host2", 1234)

Cluster(system).joinSeedNodes(seeds)

Где в соответствии с адресными документами API

  • "akka.tcp" = протокол
  • "RemoteSystem1" = Имя удаленной актерской системы
  • "host1" = Хост удаленной системы актера
  • 1234 = Порт удаленной актерской системы

РЕДАКТИРОВАТЬ

Создан минимальный пример на GitHub

val cluster = Cluster(context.system)

// Join the seed node with the given address
seedPort match {
  case Some(port) =>
    cluster.joinSeedNodes(immutable.Seq(Address("akka.tcp", "ClusterSystem", "127.0.0.1", port)))
  case _ =>
}

Может быть запущен с помощью sbt "run akkaPort [clusterPort]". Итак, чтобы изначально запустить кластер, запустите два идентичных порта:

sbt "run 1337 1337"

и затем запустите дополнительный узел с другим akkaPort:

sbt "run 1338 1337"

Этот узел затем присоединится.

Если вы опустите параметр clusterPort, он не будет выполнять эту строку:

cluster.joinSeedNodes(immutable.Seq(Address("akka.tcp", "ClusterSystem", "127.0.0.1", port))) 

И поэтому просто используя начальный узел из файла application.conf.

Другие вопросы по тегам