6

Akka アクター内から、クラスターのノードを見つけるにはどうすればよいでしょうか? つまり、ローカル ノードが現在アクセス可能であると見なしているノードです。

ありがとう - ダニエル

4

3 に答える 3

18

ClusterDomainEventまたはを実際に購読する必要はありませんMemberEvent。Cluster 拡張機能のメンバーにアクセスできますstate。たとえば、

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

val members = cluster.state.members.filter(_.status == MemberStatus.Up)
于 2014-09-19T22:39:39.383 に答える
10

Typesafe Activator チュートリアルの微調整されたサンプル:

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
  }
}
于 2013-07-29T09:04:26.053 に答える
4

1 つの方法として、別のアクターにメッセージをサブスクライブさせ、具体的にはイベント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 メッセージをこのアクターに送信し?、応答を待つことができます。

このアプローチでは、この情報を必要とする多くのアクターがいる可能性があることを前提としています。この情報を必要とするアクターが 1 人しかいないことが判明した場合は、そのアクターにそのイベントをサブスクライブさせ、その内部状態をメンバーで更新します。

于 2013-07-28T20:35:59.457 に答える