回答
你其實並不需要訂閱ClusterDomainEvent
或MemberEvent
。你可以只訪問羣集擴展的state
成員,例如,
val cluster = akka.cluster.Cluster(context.system)
val members = cluster.state.members.filter(_.status == MemberStatus.Up)
根據我的經驗(我認爲這是在某處的文檔中提到)以這種方式獲取狀態不保證同步。如果你需要一個更準確的狀態圖,你需要像Patrik Nordwall所建議的那樣,解析集羣監聽器中的事件。 – jm0
以我的經驗,你不能在同一個演員中混用這兩個成語。由於消息在郵箱中的滯留時間,響應接收中的羣集事件保證落後於實際羣集狀態。 –
thx澄清 - 我的使用案例,雖然是我需要執行裂腦分辨率,當一個成員被刪除,那麼如果不是自我管理,在這種情況下如何獲得最新的狀態?我不認爲這是關於成語的混合,更多的是以這種方式獲得狀態不能被信任。我認爲可以訂閱的ClusterState域事件會更準確(因爲系統正在通過監聽器提交整型狀態),但可能落後於按需狀態方法的響應需要多長時間改變。 – jm0
一種方法可能是有另一個演員訂閱到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消息,這演員通過?
並等待迴應。
現在這種方法假定你可能有許多演員想要這個信息。如果事實證明你只有一個演員想要這個信息,那麼只需讓該演員訂閱該事件並更新其成員的內部狀態。從Typesafe Activator tutorial
的訂閱演員, 'ClusterMemberHolder'還必須處理'MemberUp'和'MemberRemoved'事件。 publishCurrentClusterState不是必需的。 –
調整了樣本:
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. 查找集羣節點給出PostgreSQL中
- 2. Akka Streams在羣集節點上運行
- 3. 如何獲取erlang集羣中的當前節點名稱?
- 4. Cassandra 1.0.6將新節點添加到當前單節點羣集
- 5. 查找從集羣外Hadoop集羣節點列表
- 6. 針對當前負載查詢Percona羣集節點
- 7. 4節點集羣查詢
- 8. Akka集羣成員查詢
- 9. Akka集羣,節點部署在不同的數據中心
- 10. 如何在Linux集羣上查找節點名稱
- 11. 節點羣集
- 12. Akka集羣中的演員查詢
- 13. 重新啓動所有後端節點後,akka前端節點如何連接到羣集?
- 14. 如何從akka中檢索分割區域形成不同的集羣節點?
- 15. 帶演員的Akka羣集節點離開
- 16. NAT後面的akka集羣節點(使用docker)
- 17. 在AKKA中配置羣集
- 18. 如何將種子節點添加到正在運行的akka羣集
- 19. Akka集羣 - 每節點一個經理角色
- 20. 如何查找當前選定節點的類別?
- 21. 節點羣集和/或Docker羣集?
- 22. 單節點羣集在多節點羣集上工作?
- 23. 將2節點cassandra集羣轉換爲1節點集羣
- 24. 查找集羣的中心
- 25. 2節點的Cassandra集羣
- 26. Hadoop的2節點集羣
- 27. Vertx/Hazelcast:如何找出集羣成員的當前端口號?
- 28. 節點狀態查詢solr集羣
- 29. Hadoop 2節點羣集通信查詢
- 30. 如何正確部署Akka羣集
http://doc.akka.io/docs/akka/snapshot/scala/cluster-usage.html#Subscribe_to_Cluster_Events – sourcedelica