Akka:如何查找集群中的当前节点?

时间:2013-07-28 19:12:50

标签: java scala cluster-computing akka distributed-computing

在Akka演员中,你怎么能找到集群的节点? 也就是说,本地节点认为当前可访问的节点。

谢谢,   - 丹尼尔

3 个答案:

答案 0 :(得分:17)

您实际上无需订阅ClusterDomainEventMemberEvent。您只需访问群集扩展程序的state成员,例如

val cluster = akka.cluster.Cluster(context.system)

val members = cluster.state.members.filter(_.status == MemberStatus.Up)

答案 1 :(得分:9)

来自Typesafe Activator tutorial的调整样本:

case object GetNodes

class MemberListener extends Actor {

  val cluster = Cluster(context.system)

  override def preStart(): Unit =
    cluster.subscribe(self, classOf[MemberEvent])

  override def postStop(): Unit =
    cluster unsubscribe self

  var nodes = Set.empty[Address]

  def receive = {
    case state: CurrentClusterState =>
      nodes = state.members.collect {
        case m if m.status == MemberStatus.Up => m.address
      }
    case MemberUp(member) =>
      nodes += member.address
    case MemberRemoved(member, _) =>
      nodes -= member.address
    case _: MemberEvent ⇒ // ignore
    case GetNodes =>
      sender ! nodes
  }
}

答案 2 :(得分:4)

一种方法可能是让另一个演员订阅ClusterDomainEvent个消息,特别是通过CurrentClusterState事件寻找成员。这可能看起来像这样:

case object GetMembers

class ClusterMembersHolder extends Actor{
  var members:Set[Member] = Set()
  override def preStart = {
    val clusterSys = Cluster(context.system)
    clusterSys.subscribe(self, classOf[ClusterDomainEvent])
    clusterSys.publishCurrentClusterState //Forces the current state
  }

  def receive = {
    case state: CurrentClusterState =>
      members = state.members

    case GetMembers => 
      sender ! members
  }
}

这是一个粗略的大纲(可能需要一些调整),但是从这里开始,想要了解当前成员列表的任何演员都可以通过?向该演员发送GetMembers消息并等待响应。

现在,这种方法假设您可能有许多需要此信息的演员。如果事实证明你只有一个想要这个信息的演员那么只要让那个演员订阅那个事件并用成员更新它的内部状态。