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");

  

注意區分對應關係!

 

Tags: