Akka 集群單例Cluster Singleton
一、簡介
集群中Cluster Singleton 集群中有而只一個單例,可應用於集群全局調控,單一運算決策,中央命名服務或中央路由等應用場景
二、依賴
dependencies {
compile group: 'com.typesafe.akka', name: 'akka-cluster-typed_2.12', version: '2.6.4'
}
三、注意的問題
3.1 不要使用可能使集群分裂成多個孤島而形成多個集群的關閉方式,如在生產環境使用auto dowing,(不僅限於)或因節點網路不通各自形成獨立的集群,從而生成各自的單例!
3.2 集群單例要注意可能會成為性能瓶頸,(全局唯一必然導致因不能擴展多節點分散壓力)
3.3 單例因故障需要遷移到新的節點時,中間是有空隙的,遷移期間不可用服務
單例在集群環境,至少要有兩個獨立的節點來保證一個節點掛了還能有備用的頂上。
四、如何使用單例
哪如何選擇在節點間產生單例?如何選舉?
創建方式:
集群單例的關鍵對象 akka.cluster.singleton.ClusterSingletonManager ,它也是一個actor,在所有集群節點中管理單例實例,並由最老節點的ClusterSingletonManager 創建,最老的成員由akka.cluster.Member#isOlderThan確定。
當最老的節點由於像 JVM 崩潰、硬關閉或網路故障而無法訪問時,集群故障檢測器會注意到。然後將接管一個新的最老節點。
訪問方式:
提供的akka.cluster.singleton.ClusterSingletonProxy
訪問單例 Actor,該代理將所有消息路由到單例的當前實例。
代理將跟蹤集群中最老的節點,並通過顯式發送單例的actorSelection
的akka.actor.Identify
消息並等待其回復來解析單例的ActorRef
。
五、示例
創建示例
final ClusterSingletonManagerSettings settings = ClusterSingletonManagerSettings.create(system).withRole("singletonWorker"); //withRole 指定角色名,可限制單例只在當前角色名的節點下創建 system.actorOf( ClusterSingletonManager.props( Props.create(xxxx), DownMsg, //關閉單例actor時發的消息,也可以是PoisonPill settings), "singleton-name");
訪問示例
ClusterSingletonProxySettings proxySettings = ClusterSingletonProxySettings.create(system).withRole("singletonWorker"); ActorRef proxy = system.actorOf( ClusterSingletonProxy.props("/user/singleton-name", proxySettings), "singletonProxy");
注意區分對應關係!