Синглтон кластера Akka не отвечает при использовании akka-discovery через конфиг - PullRequest
0 голосов
/ 16 декабря 2018

Я создаю сервис akka и для локального тестирования, используя akka-discovery в режиме конфигурации.Я обнаружил, что при переключении с определенных начальных узлов для создания кластера на механизм обнаружения (akka-discovery) мой кластерный синглтон перестает работать.По запросу я просто получаю тайм-аут от соответствующего синглтона (я использую предложенный механизм передачи этого синглтона через прокси-сервер).Я не мог ни найти решение этой проблемы, ни понять его в настоящее время, так как я создаю экземпляр SingletonManager на каждом узле после запуска начальной загрузки кластера.Даже когда я включаю ожидание около минуты после вызова ClusterBootstrap start () перед созданием одноэлементного менеджера, я получаю тот же результат, где я думаю, что такая функциональность кластера уже доступна, так как кластер работает.

Примерные примеры кода:

  • Sbt:

"com.lightbend.akka.management" %% "akka-management-cluster-bootstrap"% "0.19.0 "," com.lightbend.akka.management "%%" akka-management "%" 0.19.0 "," com.lightbend.akka.management "%%" akka-management-cluster-http "%" 0.19.0 "," com.lightbend.akka.discovery "%%" akka-discovery-config "%" 0.19.0 "," com.typesafe.akka "%%" akka-cluster "%" 2.5.18 ","com.typesafe.akka" %% "akka-cluster-metrics"% "2.5.18", "com.typesafe.akka" %% "akka-cluster-tools"% "2.5.18", "com.typesafe.akka "%%" akka-contrib "%" 2.5.18 "," io.kamon "%" sigar-loader "%" 1.6.6-rev002 "," org.scalactic "%%" scalactic "%" 3.0.5 "," com.typesafe.akka "%%" akka-stream-testkit "%" 2.5.18 "% Test", org.scalatestplus.play "%%" scalatestplus-play "%" 3.0.0 "%" test "

  • Начало узла кластера (код выполняется на всех узлах):
     val system = ActorSystem(applicationName, baseConfig)

  AkkaManagement(system).start()

   ClusterBootstrap(system).start()

val clusterSingletonProperties = ClusterSingletonManager.props(
      singletonProps = SingletonActor.props,
      terminationMessage = PoisonPill,
      settings = ClusterSingletonManagerSettings.apply(singletonConfig)
    )
    actorSystem.actorOf(clusterSingletonProperties, "singleton")
  • вызов контроллера (я только что отправил запрос в одиночном акторе I, по любой полученной строке вернуть другую строку без какой-либо обработки):
val workerService: ActorRef = actorSystem.actorOf(
    ClusterSingletonProxy.props(
      singletonManagerPath = "/user/singleton",
      settings = ClusterSingletonProxySettings.create(singletonProxyConfig)
    )
  )

(workerService ? "holla").mapTo[String].map { message =>
      val result = Json.toJson({"result" -> message})
      Ok(result)
    })

Вышеописанное работает, когда начальные узлы определены, но не в обнаружении.Порядок, в котором я запускаю систему, загрузчик и менеджер синглтонов для меня, предполагает, что не должно быть никаких причин, по которым служба кластеров еще не доступна, так как кластер работает при создании менеджера синглтонов.

Любые предложениягде-то там?

Спасибо, С наилучшими пожеланиями, Анди

1 Ответ

0 голосов
/ 21 декабря 2018

Для тех, кто сталкивался с той же проблемой: Reason копировал класс ProdServerStart.class, с помощью которого изначально запускается Play, и добавлял в него создание actorSystem и вышеупомянутые шаги (обнаружение узла, запуск ClusterSingletonManager).Так как Play уже запускает систему актера (убедитесь, что она называется так же, как и другие узлы в кластере, что должно быть именем, указанным в вашей конфигурации обнаружения), она помогла вместо этого придерживаться исходного класса ProdServerStart.class и использоватьСтремительный синглтон, который при запуске подключает систему актера, запущенную приложением Play, и выполняет вышеуказанные шаги.Кажется немного неуловимым, что запуск системы-актера с тем же именем внутри запуска сервера вызывает вышеуказанное поведение.

...