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

注意区分对应关系!

相关推荐