【问题标题】:Search nodes in network using akka.使用 akka 搜索网络中的节点。
【发布时间】:2016-07-28 12:30:30
【问题描述】:

有没有办法搜索网络中的节点,以便如果任何节点关闭,我们可以在它启动时重新连接它。目前我正在使用 mdns,但我想用 akka 来实现这一点。我在 java 中使用 akka。

【问题讨论】:

  • 据我记得,如果节点是 Akka 集群的成员,它应该会自动重新连接。
  • 它会尝试重新连接一段时间,但一段时间后,会针对特定的无法访问的节点发出终止请求。

标签: java akka akka-cluster


【解决方案1】:

您可以在这里使用两种方法:

1) 外部 - 与集群一起运行consul.io 的实例。通过阅读 consul 集群的状态,您将了解连接到集群的所有机器 - 这将使您对节点的总集及其 IP 地址有所了解。现在在任何地方使用JMX 来检索Akka 集群的状态——你在这里寻找akka:type=Cluster bean,它的属性是MembersClusterStatus。这些将返回您的集群状态 - 因此您将知道 akka 集群中可用的节点集。如果您从 consul 集群中的节点中减去 Akka 集群中的节点集 - 您将得到那些被 Akka 集群仲裁删除/隔离的节点,并且大多数可能必须重新启动。

2) 内部 - 一旦我有 addedThisActorSystemQuarantinedEvent 到 Akka 远程处理。当一个节点来自集群的removed 时会触发此事件,然后将其置于隔离区 - 因此它无法自动重新连接到集群。所以你可以创建这样的东西:

  object ClusterWatcher {

    private class DefaultClusterWatcher extends Actor with ClusterWatcher {
      override def receive = handleQuarantinedRestart
    }

    def registerRestartJVMWatcherActor(sys: ActorSystem) = {
      val ref = sys.actorOf(Props[DefaultClusterWatcher])
      sys.eventStream.subscribe(ref, classOf[ThisActorSystemQuarantinedEvent])
    }

  }

  trait ClusterWatcher {

    _: Actor ⇒

    def handleQuarantinedRestart: Actor.Receive = {
      case err: ThisActorSystemQuarantinedEvent ⇒
        import SlackNotification._
        slackEmergency(s"Actor system ${err.localAddress} is quarantined by ${err.remoteAddress}, restarting")
        sys.exit(1)
    }

  }

在你创建了actor系统之后使用它:

val sys = ActorSystem("MyCluster", config)
ClusterWatcher.registerRestartJVMWatcherActor(sys)

然后,每当DefaultClusterWatcher 收到隔离事件时 - 它会重新启动整个 JVM(或对参与者系统执行其他操作 - 由您决定)。

我发现这些方法的组合是最强大的 - 在我的设置中,它允许我在具有适度网络连接的不同数据中心运行由 30 个节点组成的自我维持分布式集群。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多