"Principles of Reactive Programming" 之<Actors are Distributed> (2)
Actor Path
我们知道actor是有层级的(hierarchical),第、每个actor在它的父actor的名字空间下都有一个名字。这样就构成了一个树状的结构,就像是文件系统。每个actor就像文件系统里的一个文件夹,因为每个actor都可以有子actor,因此,它们更像是文件夹,而不是文件。
val system = ActorSystem("HelloWorld")
val ref = system.actorOf(Props[Greeter], "greeter")
println(ref.path)
// prints: akka://HelloWorld/user/greeter
在这上面这段代码里,greeter的父actor是user(所有用户通过system.actorOf建的actor,都是user的子actor)。
greeter的path是akka://HelloWorld/user/greeter
这是一个URI。
其中authority part是akka://HelloWorld,这也是HelloWorld这个actor system的地址。akka://是一个协议,说明这是一个本地的actor path.
/user/greeter,是actor的path,这里就是greeter这个actor的path.
它们加起来就表示greeter这个actor的URI。
其实,每个actor system可以有多个地址,比如上边的HelloWorld当远程访问时,它的地址可以是 akka.tcp://HelloWorld@10.2.4.6:6565。其中akka.tcp说明这个这个actor system需要通过tcp协议访问,名字是HelloWorld, IP为10.2.4.6,端口为6565。如果访问这个actor system里的greeter这个actor,那么地址是akka.tcp://HelloWorld@10.2.4.6:6565/user/greeter
这说明每个actor system都可以多个地址,如果它能通过多个协议或者多个IP地址访问。
The difference between ActorPath and ActorRef
ActorPath和文件路径一样,你可以随便拼凑文件路径,即使它所指向的地方并没有文件。但是ActorRef一定指向一个存在的文件(对于actor,更像是文件夹,因为actor可以有子actor)。
每个ActorRef都会有一个path, 指向这个ActorRef。但是ActorPath可以指向一个并不存在的ActorRef,因此ActorPath是不可以被watch的,但是ActorRef可以。因为,ActorRef只能被以有限的方式获取,这些获取方式保证了它一定是某个已经在工作的actor的reference。无法获取一个并不存在的actor的ActorRef。 也因为如此,向一个ActorPath发送消息和向ActorRef发送消息是不同的。
另外,对于ActorRef,如果一个ActorPath指向的actor停止了,那么它的parent可以用同样的名字启动另一个actor,那么新的actor和已经终止的actor有同样的actorPath,但是它们有不同的ActorRef。ActorRef的最后有一个UID,它标识了ActorRef的不同。
Actor names are unique within a parent, but can be reused.
- ActorPath is the full name, whether the actor exists or not.
- ActorRef points to an actor which was started; an incarnation.
ActorPath can only optimistically send a message.
ActorRef can be watched.
ActorRef example: akka://HelloWorld/user/greeter#43438347 (print 一个ActorRef显示的值)
Resolving an ActorPath
case class Resolve(path: ActorPath)
case class Resolved(path: ActorPath, ref: ActorRef)
case class NotResoved(path: ActorPath)
case class ToBeResolved(path: ActorPath, client: ActorRef) class Resolver extends Actor{
def receive = {
case Resolve(path) => context.actorSelection(path) ! Identify(ToBeResolved(path, sender()))
case ActorIdentity(ToBeResolved(path, client), Some(actorRef)) => client ! Resolved(path, actorRef)
case ActorIdentity(ToBeResolved(path, client), None) => client ! NotResoved(path)
}
}
有些时候我们不能直接获取ActorRef,比如另一个ActorSystem里,不是你创建的一个actor。这时候就需要另一套机制了,就是Identify和ActorIdentify。每一个Actor都能处理Identify消息,把自己的ActorRef封装于ActorIdentify中返回给sender。这就是通过通信来获取ActorRef, 总之, ActorRef是不能凭空先出来一个的,它一定代表一个存在的actor。
Relative Actor Paths
Looking up a grand-child:
- context.actorSelection("child/grandchild")
Looking up a sibling:
- context.actorSelection("../sibling")
Looking up from the local root:
- context.actorSelection("/user/app")
Broadcasting using wildcasts:
- context.actorSelection("/user/controllers/*")
actor path的语义跟文件系统的path非常类似。
"Principles of Reactive Programming" 之<Actors are Distributed> (2)的更多相关文章
- "Principles of Reactive Programming" 之<Actors are Distributed> (1)
week7中的前两节课的标题是”Actors are Distributed",讲了很多Akka Cluster的内容,同时也很难理解. Roland Kuhn并没有讲太多Akka Clus ...
- "Principles of Reactive Programming" 之<Actors are Distributed> (3)
Cluster 讲课的这哥们接下来讲了下Akka Cluster的使用,但是是通过把一个以前讲过的actor 系统改成使用cluster来介绍的Akka cluster. 这部分代码很多,还是直接看视 ...
- "Principles of Reactive Programming" 之 <Persistent Actor State>学习笔记
这是<Pinciples of Reactive Programming>week6的最后一课. 为什么需要把actor的状态持久化? 如果actor没有状态,那么在任何实时,这个acto ...
- Notes of Principles of Parallel Programming - TODO
0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...
- "reactive programming"的概念
下面的内容大多是翻译来的. Reactive Programming? What is Reactive Programming? 为了了解Reactive——从编程范式至其背后的动机,有必要了解现在 ...
- .Net中的反应式编程(Reactive Programming)
系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...
- Unity基于响应式编程(Reactive programming)入门
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- ReactiveCocoa与Functional Reactive Programming
转自 http://blog.leezhong.com/ios/2013/06/19/frp-reactivecocoa.html Functional Reactive Programming(以下 ...
- [Reactive Programming] RxJS dynamic behavior
This lesson helps you think in Reactive programming by explaining why it is a beneficial paradigm fo ...
随机推荐
- 【转】MySQL的安装与配置
一.MySQL的安装 1.在线安装: 命令:sudo apt-get install mysql-server 在安装的过程中将提示为“root”用户设置密码,输入自己的密码即可,安装按成后已自动配置 ...
- 使用SoapUI 测试 Web Service
一.官方定义 soapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclip ...
- GitHub 基本操作流程
GitHub是最先进的分布式版本控制工具,下面是我学习中总结的操作流程,仅供参考 ----------------------------------------------------------- ...
- centos6.5安装配置zabbix3.0.3
1.首先要准备LAMP环境. (1)安装php Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上 rpm ...
- JS滑动门,JQuery滑动门
<a href="#" id="one1" onmouseover="setTab('one',1,2)" class="h ...
- DTCMS自定义标签,获取所有栏目文章列表TOP,以及文章通用URL
网站最近更新等地方,发现DTCMS没有获取所有栏目文章列表的标签,只能自己写 思路:获取所有栏目文章列表不难,难点在于linkurl的写法 1.制作获取所有文章列表标签 DTcms.Web.UI\La ...
- 声明(创建) JavaScript 变量
在 JavaScript 中创建变量通常称为"声明"变量. 我们使用 var 关键词来声明变量: var carname; 变量声明之后,该变量是空的(它没有值). 如需向变量赋值 ...
- dbt
Procedure Relocate(s : state; b : base_index) { Move base for state s to a new place beginning at b ...
- Python数据结构——二叉树的实现
1. 二叉树 二叉树(binary tree)中的每个节点都不能有多于两个的儿子. 1.1 二叉树列表实现 如上图的二叉树可用列表表示: tree=['A', #root ['B', #左子树 ['D ...
- Android SDK离线安装方法详解(加速安装) 转
AndroidSDK在国内下载一直很慢··有时候通宵都下不了一点点,最后只有选择离线安装,现在发出离线安装地址和方法,希望对大家有帮助! 离线安装包下载地址:http://dl.vmall.com/c ...