- Actor通信模型总结
1) Actor模型中使用了Akka协议信息传输。 2) 在基于 Actor的系统里,所有的事物都是 Actor,就好像在面向对象设计里面所有的事物都是对象一样。 3) Actor模型是作为一个并发模型设计和架构的。Actor与Actor之间只能通过消息通信,如图中的MailBox. 4) Actor与 Actor之间只能用消息进行通信,当一个 Actor 给另外一个 Actor 发消息,消息是有顺序的(消息队列),只需要将消息投寄的相应的邮箱即可。 5) 怎么处理消息是由接收消息的 Actor 决定的,发送消息 Actor 可以等待回复,也可以异步处理. 6) ActorSystem 的 职 责 是 负 责 创 建 并 管 理 其 创 建 的 Actor , ActorSystem 是 单 例 的 ( 可 以ActorSystem 是一个工厂,专门创建 Actor),一个 JVM 进程中有一个即可,而 Acotr是可以有多个的。 7) Actor 模型是对并发模型进行了更高的抽象。 8) Actor 模型是异步、非阻塞、高性能的事件驱动编程模型。9) Actor 模型是轻量级事件处理(1GB 内存可容纳百万级别个 Actor),因此处理大并发性能高. |
2. ActorSystem的层次结构
1) ActorySystem 创建 Actor 2) ActorRef:可以理解成是 Actor 的代理或者引用。消息是通过 ActorRef 来发送,而不能通过 Actor 发 送消息,通过哪个 ActorRef 发消息,就表示把该消息发给哪个 Actor 3) 消息发送到 Dispatcher Message (消息分发器),它得到消息后,会将消息进行分发到对应的 MailBox。(注: Dispatcher Message 可以理解成是一个线程池, MailBox 可以理解成是消息队列,可以缓 冲多个消息,遵守 FIFO) 4) Actor 可以通过 receive 方法来获取消息,然后进行处理。 Actor 模型的消息机制(对应上图) 1) 每一个消息就是一个 Message 对象。Message 继承了 Runable, 因为 Message 就是线程类。 2) 从 Actor 模型工作机制看上去很麻烦,但是程序员编程时只需要编写 Actor 就可以了,其它的交给 Actor 模型完成即可。 3) A Actor 要给 B Actor 发送消息,那么 A Actor 要先拿到(也称为持有) B Actor 的 代理对象ActorRef 才能发送消息 |
3. 什么是ActorPath
What is an Actor Path? 由于Actor是以严格的分层方式创建的,因此存在一个独特的Actor名称序列,通过递归地跟随子和父母之间的监督链接向下朝向Actor系统的根来给出。此序列可以看作是文件系统中的文件夹,因此我们采用名称“path”来引用它,尽管actor层次结构与文件系统层次结构有一些根本区别。 一个actor路径包含一个anchor,它标识了actor系统,然后是路径元素的串联,从根守护者到指定的actor;path元素是遍历的actor的名称,并用斜杠分隔。 |
4. 如何查找Actor Reference?如何创建Actor Reference
Actor Reference是ActorRef的的子类型,ActorRef的主要作用是支持向它所代表的Actor发送消息。 每个actor都可以通过self来访问它的规范(本地)引用,默认情况下, 此引用也被作为给其他Actor发送消息的发件人使用。 在消息处理期间,Actor可以通过访问sender字段获取消息发送方的引用。 |
5. Scala中的隐式转换
Scala中使用implicit修饰的变量,方法,类支持隐式转换 当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型) |
使用implicit修饰的变量,可以在方法需要参数时,编辑器自动加载到方法参数中 |
隐式转换函数是以 implicit 关键字声明的带有单个参数的函数。这种函数将会自动应用,将值从一种类型转换为另一种类型 1) 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类 型和返回值类型)有关。 2) 隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能 被识别 |
隐式类使用有如下几个特点: 1) 隐式类的构造参数有且只能有一个 2) 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的(top-level objects)。 3) 隐式类不能是 case class 4) 作用域内不能有与之相同名称的标识符 |