Scala --Actor通信模型概述

  1. 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)  作用域内不能有与之相同名称的标识符

猜你喜欢

转载自www.cnblogs.com/eric666666/p/11203479.html