Akka-Cluster(1)- 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() //seednode
createSingleton()
createSingleton()
createSingleton() scala.io.StdIn.readLine() sendToSingleton(Greeting("hello from tiger"))
scala.io.StdIn.readLine() sendToSingleton(Relocate)
scala.io.StdIn.readLine() sendToSingleton(Greeting("hello from cat"))
scala.io.StdIn.readLine() sendToSingleton(Die)
scala.io.StdIn.readLine() }
检验一下输出简要:
[INFO] [// ::25.642] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:51660/user/$a] Singleton identified at [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/user/singletonManager/singleton]
[INFO] [// ::25.654] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/user/singletonManager/singleton] *********got hello from tiger from akka.tcp://ClusterSingletonSystem@127.0.0.1:51660******** [INFO] [// ::10.839] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/user/singletonManager/singleton] *********I'll move from akka://ClusterSingletonSystem********
INFO] [// ::18.885] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:51670/user/$a] Singleton identified at [akka.tcp://ClusterSingletonSystem@127.0.0.1:2552/user/singletonManager/singleton]
[INFO] [// ::18.886] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2552/user/singletonManager/singleton] *********got hello from cat from akka.tcp://ClusterSingletonSystem@127.0.0.1:51670******** [INFO] [// ::18.156] [ClusterSingletonSystem-akka.actor.default-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/user/singletonManager/singleton] *******I'm shutting down ... ********
[INFO] [// ::18.177] [ClusterSingletonSystem-akka.remote.default-remote-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/system/remoting-terminator] Shutting down remote daemon.
[INFO] [// ::18.178] [ClusterSingletonSystem-akka.remote.default-remote-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/system/remoting-terminator] Remote daemon shut down; proceeding with flushing remote transports.
[INFO] [// ::18.215] [ClusterSingletonSystem-akka.remote.default-remote-dispatcher-] [akka.tcp://ClusterSingletonSystem@127.0.0.1:2551/system/remoting-terminator] Remoting shut down.
Akka-Cluster(1)- Cluster Singleton 单例节点的更多相关文章
- Singleton(单例)模式
Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】
static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...
- Singleton 单例模板
// singleton.h #ifndef SINGLETON_H #define SINGLETON_H // 单例基类模板 template <class T> class Sing ...
- lintcode:Singleton 单例
题目: 单例 单例是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们 ...
- 从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备
关于 面向对象的设计模式 对于面向对象的设计模式,想必大家并不陌生吧. 纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧.当然,本文总结 ...
- Unity Singleton 单例类(Unity3D开发之二十)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...
- C++ Singleton (单例) 模式最优实现
参考:http://blog.yangyubo.com/2009/06/04/best-cpp-singleton-pattern/ 索引 静态化并不是单例 (Singleton) 模式 饿汉模式 懒 ...
- Singleton单例类模式
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
随机推荐
- python入门学习0
Python 是什么类型的语言 Python是脚本语言 Python下载地址:https://www.python.org/downloads/ Python版本:Python 3.4.2 - 64b ...
- 云笔记项目-AOP知识简单学习
在云笔记项目的过程中,需要检查各个业务层的执行快慢,如登录.注册.展示笔记本列表,展示笔记列表等,如果在每个业务层方法里都写一段代码用来检查时间并打印,不仅仅显得代码重复,而且当项目很大的时候,将大大 ...
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...
- oracle优化技巧及实例(总结)
1.关于exists和in in是循环的方式,在内存中处理, exists是执行数据库查询, select tpd.personaccountid,sum(nvl(tpd.CREDIT_SUM, 0) ...
- 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理
前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...
- jsonarray根据id排序
List<JSONObject> jsonValue=new ArrayList<JSONObject>(); JSONArray sortJsonarr=new JSONAr ...
- adc指令
adc是带进位加法指令,它利用了CF位上记录的进位值. 指令格式: adc 操作对象1,操作对象2 功能:操作对象1 = 操作对象1 + 操作对象2 + CF 例如指令 adc ax,bx实现的功能 ...
- 以太坊Inner Transaction合约内充值转账
- C#,如何程序使用正则表达式如何使用匹配的位置的结果修改匹配到的值
程序代码使用正则表达式如何修改匹配到的值: 代码一: using System; using System.Text.RegularExpressions; public class Example ...
- 一 分析easyswoole源码(启动服务)
分析easyswoole源码 1以启动为例 //检查是否已经安装 installCheck();//检查锁文件是否存在,不存在结束 //启动服务 serverStart showLogo();//显示 ...