【往期总结】Akka Study Notes



  • Akka班学习总结

    作者:杨元龙(Dylan) 太阁xMOOC学院负责人、Akka班班长

    Akka101 - Actor Basic

    1973年Carl Hewitt 首次在其发表的论文 “A Universal Modular Actor Formalism for Artificial Intelligence” 中提出了Actor 模型。但基于Actor模型构建的大规模应用却是在Erlang上完成的。 Akka的发展继承和借鉴了很多Erlang的优秀特性。

    简单来说, Actor可以被看做成一个独立的的对象,每个Actor都有独立的状态跟行为。Actor之间的通信是通过消息传递(Message-passing)来完成。 这样做的优点就是简化了传统的多线程问题处理中锁及线程管理的问题。同时由于每个Actor都是超轻量的级(仅占用4kb空间),所以创建单个Actor的代价也非常的小,大约每GB内存可以创建几百万个Actor。

    Actor 的组成

    Actor对外界世界而言就是个黑盒子,每个Actor由4部分组成:
    Actor Instance 包含了Actor的状态与行为。
    ActorRef 作为Actor与外界沟通的唯一接口(Interface)。
    Mail Box 是Actor Sender跟Actor Receiver之间用来存储接收消息的实体,本质上是个队列结构(Queue),每个Actor有且仅有一个Mail Box。
    Dispatcher: 是维持整个Actor系统运作的核心,可以理解为整台机器的发动机部分。默认情况下Actor系统会使用”fork-join-executor”的派发器,绝大多数情况下都能获得良好性能。

    0_1469815883481_a1.png

    Actor的运作原理

    首先Actor是通过ActorRef来接收外部发送的消息, 并非Actor Instance。ActorRef会将这条消息转发到Dispatcher。这条消息也就被存储(Enqueue)到Mail Box中,紧接着Dispatcher会将某个Thread分配给这个Mail Box。 当轮到Mail Box执行的时候,消息就会被取出来(Dequeue),发送到Actor的Receive方法来执行(注:Receive方法本质上是个偏函数,是每个Actor都独有的方法,定义了接收到消息后该如何对消息进行处理,在Scala中常用模式匹配来完成)。整个过程中一旦消息被放到Mail Box后,Dispatcher紧接着会处理下一条新消息,并不会发生阻塞。

    0_1469815920891_a2.png

    Actor的生命周期

    每个Actor都有自己的生命周期, 如下图所示,Actor的生命周期是非常直观的,每个Actor由最初的初始状态(Initialized)到最后的终止状态(Terminated),期间还会经历各种其他的状态转换。

    0_1469816896375_a3.png

    当我们通过Actor.of方法来创建一个Actor的时候,Actor系统内部是通过调用preStart()来进行初始化创建一个Actor的实例对象,这时候Actor也就从Initialized转变到Started状态,这时候我们可以认为Acotr已经创建完成,可以接下来进行各种消息处理。
    当ActorRef收到”Stop”的消息时候,Actor就可以中断其内部进程,进入到停止状态(Stopped), 或者当Actor完成一件工作的时候,Actor会释放资源,进入到结束状态(Terminated)。

    当发生异常时(Exception), Actor也会面临多项抉择,这也就涉及到Supervison and Monitor的相关部分,简言之作为单个Actor可以有如下选择:

    1. 恢复之前的信息跟状态(Resume)
    2. 创建新的Actor来代替旧的Actor(Restart)
    3. 停止(Stop)

    如何完成对Actor对各种情况的应对一般是通过设置Callback,根据需求来重写PreStart(), PreRestart(), PostStrop(), PostRestart() 等方法来实现。


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待