Как я могу определить 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.