设为首页 加入收藏

TOP

Akka-Cluster(1)- Cluster Singleton 单例节点(一)
2019-08-15 00:11:26 】 浏览:156
Tags:Akka-Cluster Cluster Singleton 单例 节点

   关于cluster-singleton我在前面的博文已经介绍过,在这篇我想回顾一下它的作用和使用方法。首先,cluster-singleton就是集群某个节点上的一个actor。任何时间在集群内保证只会有一个这种actor的实例。它可以是在任何节点上,具体位置由akka-cluster系统的leader节点根据一定规则选定。当cluster-singleton所处的节点停止运作时leader会选择另一个节点,然后系统会将cluster-singleton迁移到新的节点上来保证集群中一定有一个活着的cluster-singleton实例,不过值得注意的是迁移的actor会丢失它的内部状态。在编程实践中常常会需要保证一项程序功能只能由唯一的actor来运行的情况,比如我们需要保证某种运算的顺序,这时在集群环境里就可以使用cluster-singleton了。下面是cluster-singleton可能的一些使用场景:

1、在集群中的一个单点运算决策角色,或者是集群各节点交互运算的协调角色

2、集群与外界软件唯一的接口点

3、单一主角,多个从属

4、中央命名机制,或者中央路由逻辑

cluster-singleton的工作原理是:在集群的所有节点上都部署一个能产生、启动某singleton类型的ClusterSingletonManager,这样可以保证singleton可以迁移到任何节点。集群中的leader节点动态决定singleton的具体生存节点并指示该节点上的ClusterSingletonManager创建singleton实例。其它actor与singleton的交互是通过这个singleton类型的ClusterSingletonProxy进行的,这是cluster系统提供的一项与singleton交互的渠道服务,在需要接触singleton时可以创建ClusterSingletonProxy实例,然后把它当作目标发送操作消息,这样就可以保证cluster-singleton的位置透明特性了。

下面我们就用个简单的例子来示范cluster-singleton的使用看看它的唯一性和自动迁移特点:

构建一个简单的actor:

class SingletonActor extends Actor with ActorLogging { import SingletonActor._ import akka.cluster._ override def receive: Receive = { case Greeting(msg) => log.info("*********got {} from {}********", msg, sender().path.address) case Relocate => log.info("*********I'll move from {}********", self.path.address) val cluster = Cluster(context.system) cluster.leave(cluster.selfAddress) case Die => log.info("*******I'm shutting down ... ********") self ! PoisonPill } }

把SingletonActor包嵌在ClusterSingletonManager里:

bject SingletonActor {
  trait SingletonMsg {}
  case class Greeting(msg: String) extends SingletonMsg
  case object Relocate extends SingletonMsg
  case object Die extends SingletonMsg

 def props = Props(new SingletonActor) def createSingleton(port: Int) = { val config = ConfigFactory.parseString(s"akka.remote.netty.tcp.port=$port") .withFallback(ConfigFactory.parseString("akka.cluster.roles=[singleton]")) .withFallback(ConfigFactory.load()) val singletonSystem = ActorSystem("ClusterSingletonSystem",config) val singletonManager = singletonSystem.actorOf(ClusterSingletonManager.props( singletonProps = props, terminationMessage = Die, settings = ClusterSingletonManagerSettings(singletonSystem) .withRole(Some("singleton"))   //只部署在角色是singleton的节点上
 ), name = "singletonManager" ) } }

注意:singletonManager就是一个actor,所以是用actorOf(...)来构建的。现在这个singletonManager只能部署在singleton角色的节点上。

调用SingletonActor是通过ClusterSingletonProxy进行的:

object SingletonUser { import SingletonActor._ def sendToSingleton(msg: SingletonMsg) = { val config = ConfigFactory.parseString("akka.cluster.roles=[greeter]") .withFallback(ConfigFactory.load()) val system = ActorSystem("ClusterSingletonSystem",config) val singletonProxy = system.actorOf(ClusterSingletonProxy.props( "user/singletonManager", ClusterSingletonProxySettings(system).withRole(None) )) singletonProxy ! msg } }

withRole(None)代表singletonProxy可以部署在任何节点上。下面是测试代码:

import SingletonActor._ import SingletonUser._ object SingletonDemo extends App { createSingleton(2551)    //seednode
  createSingleton(2552) createSingleton(2553) create
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Scala学习笔记(一) 下一篇关于在MySql的decimal中犯的一个..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目