通过配置使用

时间:2018-12-16 16:11:17

标签: akka akka-cluster

我正在构建akka服务,并在配置模式下使用akka-discovery建立本地测试目的。 我发现,从用于集群创建的已定义种子节点切换到发现机制(akka-discovery)时,集群单例停止工作。在一个问题上,我只是从相应的单例中获取超时(我正在使用通过代理累积到该单例的建议机制)。 因为我在启动集群引导程序后在每个节点上创建了SingletonManager实例,所以我目前无法找到解决该问题的方法,也无法理解它。即使我在创建Singleton Manager之前在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群集”%“ 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”%“糖装载机”%“ 1.6.6-rev002”,         “ org.scalactic” %%“ scalactic”%“ 3.0.5”,         “ com.typesafe.akka” %%“ akka-stream-testkit”%“ 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")
  • 控制器调用(我刚刚在单例演员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 :(得分:0)

对于遇到相同问题的用户: 原因是复制原生启动Play的ProdServerStart.class,然后添加actorSystem的创建以及上述步骤(节点发现,ClusterSingletonManager的启动)。 由于Play已经启动了一个actor系统(请确保其名称与集群中的其他节点相同,必须是您的Discover配置中给定的名称),因此它有助于坚持使用原始ProdServerStart.class类并使用急切的单身人士,在启动时将Play应用程序启动的actor系统连接到并执行上述步骤。 在服务器启动中启动具有相同名称的actor系统会导致上述行为,这似乎有点微妙。