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)的更多相关文章

  1. "Principles of Reactive Programming" 之<Actors are Distributed> (1)

    week7中的前两节课的标题是”Actors are Distributed",讲了很多Akka Cluster的内容,同时也很难理解. Roland Kuhn并没有讲太多Akka Clus ...

  2. "Principles of Reactive Programming" 之<Actors are Distributed> (3)

    Cluster 讲课的这哥们接下来讲了下Akka Cluster的使用,但是是通过把一个以前讲过的actor 系统改成使用cluster来介绍的Akka cluster. 这部分代码很多,还是直接看视 ...

  3. "Principles of Reactive Programming" 之 <Persistent Actor State>学习笔记

    这是<Pinciples of Reactive Programming>week6的最后一课. 为什么需要把actor的状态持久化? 如果actor没有状态,那么在任何实时,这个acto ...

  4. Notes of Principles of Parallel Programming - TODO

    0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...

  5. "reactive programming"的概念

    下面的内容大多是翻译来的. Reactive Programming? What is Reactive Programming? 为了了解Reactive——从编程范式至其背后的动机,有必要了解现在 ...

  6. .Net中的反应式编程(Reactive Programming)

    系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...

  7. Unity基于响应式编程(Reactive programming)入门

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  8. ReactiveCocoa与Functional Reactive Programming

    转自 http://blog.leezhong.com/ios/2013/06/19/frp-reactivecocoa.html Functional Reactive Programming(以下 ...

  9. [Reactive Programming] RxJS dynamic behavior

    This lesson helps you think in Reactive programming by explaining why it is a beneficial paradigm fo ...

随机推荐

  1. 刷机nexus4

    官方rom下载地址:https://developers.google.com/android/nexus/images?hl=zh-CN 刷机教程:http://jingyan.baidu.com/ ...

  2. WCF开发教程资源收集

    WCF开发教程资源收集 1.蒋金楠,网名Artech的博客 [原创]我的WCF之旅(1):创建一个简单的WCF程序[原创]我的WCF之旅(2):Endpoint Overview[原创]我的WCF之旅 ...

  3. Cocos2d-x优化中图片优化

    在2D游戏中图片无疑是最为重要的资源文件,它会被加载到内存中转换为纹理,由GPU贴在精灵之上渲染出来.它能够优化的方面很多,包括:图片格式.拼图和纹理格式等,下面我们从这几个方面介绍一下图片和纹理的优 ...

  4. NSArray的Category

    NSArray的Category 前言 项目中自己通过各种渠道及结合项目的经验整理了一套自己的工具包,里面有各种Category,及封装的方法,方便项目使用,今天先分享一下NSarray的Catego ...

  5. iOS夯实:内存管理

    iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...

  6. java concurrent包的学习(转)

    java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...

  7. dom4j api 详解--XPath 节点详解

    dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...

  8. Unity学习笔记(3):获取对象

    在上一篇文章中(Unity映射注册)中概要介绍了Unity中的映射机制,本节主要介绍对象获取,包括默认获取,通过名称获取,获取全部对象,同时通过加载配置文件,然后再获取对象. 通过代码获取对象 方式1 ...

  9. 如何实现zs无限期试用

    要删除的文件有两个,分别是.zs与10_0..zs保存的是版本号,10_0保存的是注册码,这两个文件存在的原理是:zend studio 每次启动的会检查这两个文件的创建时间,和当前日期对比,超过30 ...

  10. phpcms v9 源码解析- 2 base.php

    base.php在上文已经说过,是在PC中重要的一个文件,基本常量.核心类文件的加载都由它来完成. 9行,定义了一个常量 IN_PHPCMS,在系统的入口定义一个常量,在其他文件就判断是否这个常量被定 ...