Akka アクター内から、クラスターのノードを見つけるにはどうすればよいでしょうか? つまり、ローカル ノードが現在アクセス可能であると見なしているノードです。
ありがとう - ダニエル
Akka アクター内から、クラスターのノードを見つけるにはどうすればよいでしょうか? つまり、ローカル ノードが現在アクセス可能であると見なしているノードです。
ありがとう - ダニエル
ClusterDomainEvent
またはを実際に購読する必要はありませんMemberEvent
。Cluster 拡張機能のメンバーにアクセスできますstate
。たとえば、
val cluster = akka.cluster.Cluster(context.system)
val members = cluster.state.members.filter(_.status == MemberStatus.Up)
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
}
}
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 人しかいないことが判明した場合は、そのアクターにそのイベントをサブスクライブさせ、その内部状態をメンバーで更新します。