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");
注意区分对应关系!