通过配置使用Akka发现时,Akka集群singleton不会应答



我正在构建一个akka服务,并在配置模式下使用akka发现进行本地测试。我发现,当从为集群创建定义的种子节点切换到发现机制(akka发现(时,我的集群单例停止工作。在一次询问中,我只是从相应的单例中得到一个Timeout(我使用的是通过代理与该单例通信的拟议机制(。我目前既找不到这个问题的解决方案,也不了解它,因为我在启动集群引导后在每个节点上创建了SingletonManager实例。即使在创建单例管理器之前,在ClusterBootstrap start((调用后等待大约一分钟,我也会得到同样的结果,我认为这样的集群功能在集群启动后就已经可用了。

粗略代码示例:

  • Sbt:

"com.lightbend.akka.management"%%"akka管理群集引导程序"%"0.19.0","com.lightbend.akka.management"%%"akka-management"%"0.19.0","com.lightbend.akka.management"%%"akka管理群集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群集度量"%"2.5.18","com.typesafe.akka"%%"akka群集工具"%"2.5.18","com.typesafe.akka"%%"akka contrib"%"2.5.18","io.kamon"%"sigar加载器"%"1.6.6-rev002","org.scalatic"%%"scalatic"%"3.0.5","com.typesafe.akka"%%"akka流测试试剂盒"%"2.5.18"%测试,"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")
  • 控制器调用(我刚刚发送了请求,在singleton actor 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)
})

当定义种子节点时,上述方法有效,但在发现中无效。我启动系统、引导程序和单例管理器的顺序表明,不应该有集群服务不可用的原因,因为在创建单例管理程序时集群已经启动。

有什么建议吗?

谢谢,顺致敬意,Andi

对于那些遇到同样问题的人:原因是复制本机启动Play的ProdServerStart.class,并将actorSystem的创建和上述步骤(节点发现、ClusterSingletonManager的启动(添加到其中。由于Play已经启动了一个actor系统(确保它的名称与集群中的其他节点相同,必须是您的发现配置中给定的名称(,因此它有助于坚持使用原始的ProdServerStart.class类,并使用一个热切的单例,该单例在启动时会让Play应用程序启动actor系统,并执行上述步骤。在服务器启动中启动具有相同名称的actor系统会导致上述行为,这似乎有点微妙。