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

У меня есть кластер 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://[email protected]:2555",
    "akka.tcp://[email protected]: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-адрес исходных узлов только на этапе развертывания. Есть ли способ определить эти параметры при запуске.


person Newton Zou    schedule 19.06.2017    source источник


Ответы (1)


Как описано в документации по кластеру Akka.

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

Согласно Akka API docs требуется последовательность из 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.

person thwiegan    schedule 19.06.2017
comment
1. Где я должен разместить этот код? 2. Если я использую этот код, как насчет конфигурации в application.conf? У них конфликт? - person Newton Zou; 20.06.2017
comment
Этот код будет использоваться везде, где вы инициализируете свой кластер, поэтому, вероятно, при запуске приложения. Что касается конфига, это хороший момент. Я постараюсь сегодня получить минимальный пример на github. - person thwiegan; 20.06.2017
comment
@NewtonZou Обновил мой ответ работающим примером - person thwiegan; 20.06.2017