上一篇我们简介了Actor系统。说明了Actor之间存在着层次关系,它也是构成Actor应用的最主要的单位。

本篇介绍Actor本身的一些基本概念。
一个Actor包括了State(状态),Behavior(行为)。一个Mailbox(邮箱)和Supervisor Strategy (管理员策略),全部这些都封装在一个Actor引用之中(Actor Reference)。
Actor 引用
一个Actor对象须要和外界隔离开来才干构成一个Actor模型,因此从外部看,一个Actor对象由一个Actor引用来表示(想一想文件句柄的概念,这里有些相似)。一个Actor对象能够被传来传去。但从Actor系统外部一般无法窥视Actor内部的一些结构。
状态
一个Actor对象一般会包括一些变量,能够用来保存Actor当前的一些状态。这能够是一个有限状态机(FSM),一个计数器,等待处理的请求等。

正是因为这些状态才使得Actor变得有价值,而且这些状态须要保护起来以免被其他Actor破坏。一个好消息是Akka的Actor从概念上说都包括一个自己的轻量级的线程,全然和系统的其他部分分隔开来。这意味着你无需考虑同步互锁的情况。
而在幕后。Akka会在一种物理线程上执行多个Actor对象。一般是几个Actor共享一个物理线程。而某个Actor的兴许调用可能会使用不同的物理线程,而这些详细的实现细节对于Akka Actor使用者来说不须要了解。
因为Actor的内部状态对于Actor的操作非常重要。因此保持一致的状态什么必要,因此当一个Actor出错须要由其管理员重新启动时。其状态会又一次构造,就和最初创建Actor一样。
但也能够选择在Actor重新启动时恢复之前的某个存储点。
行为
每当处理一个信息时。它和Actor当前的某个行为做匹配,一个行为为一个函数,它定义了某些动作,也就是某个消息来时须要做的事。比方在用户通过验证是转发请求而在验证失败时拒绝请求。这些行为可能随时间而变化。

邮箱
一个Actor对象的作用是用来处理消息。这些消息能够由一个actor发给另外的actor对象(也能够来自外部actor)。

而用来连接发送者和接受者的部件就是邮箱。每一个Actor都有且仅仅有一个邮箱,全部发送者都将消息发送到这个消息队列,不同的发送者发送消息的顺序可能是随机发生的。而对于同一个发送者来说。发送消息的顺序和到达邮箱的顺序是一致的。

能够选择不同的邮箱实现,缺省为FIFO(先进先出队列).这对于通常情况来说是非常有利的,但对于某些情况,比方须要处理一些高优先级的消息,此时使用FIFO就不太合适了。
AKKa系统和其他Actor模型实现不同的一点是。当前的Actor行为必须处理下一个队列中的消息。没有办法能够扫描队列中匹配的消息。缺省情况下,假设某个消息没有处理将作为出错处理,除非你又一次定义这样的行为。
子Actor
每一个Actor都能够成为一个管理者(supervisor)。假设它创建用来处理子任务的子Actor对象。该Actor将自己主动管理子Actor。Actor的Context保存了其创建的一组子Actor对象并能够訪问他们。这个列表的改动能够通过创建(context.actorOf),停止(context.stop(child))等来完毕。

实际的创建和终止时异步发生的,因此创建和终止子Actor不会堵塞管理员Actor。

管理员策略
管理员策略用来处理子Actor出错时的情况。这些错误情况的处理由Akka依据定义的管理员策略来自己主动完毕。因为这些策略对于一个Actor系统的组成是最主要的,因此在Actor创建之后,管理员策略不能改动。
因为一个Actor仅仅能定义一个管理员策略,这意味着假设一个Actor的子对象须要不同的管理员策略时。那么须要一些中间层Actor来对这些子Actor进行分组。
终止Actor
当一个Actor中止(比方重新启动没有成功,自行终止,或者其管理员终止其执行),其占用的资源会被释放。并把其尚未处理的消息加入到系统的“死信邮箱”中。这些死消息会作为DeadLetter转发给EventSystem。其邮箱被替换成一个系统邮箱,将新收到的消息作为DeadLetter转发到EventSystem。

Akka 编程: 什么是Actor的更多相关文章

  1. Akka系列---什么是Actor

    本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间 ...

  2. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  3. Akka源码分析-Actor&ActorContext&ActorRef&ActorCell

    分析源码的过程中我们发现,Akka出现了Actor.ActorRef.ActorCell.ActorContext等几个相似的概念,它们之间究竟有什么区别和联系呢? /** * Actor base ...

  4. Akka源码分析-Actor发消息(续)

    上一篇博客我们分析道mailbox同时也是一个forkjointask,run方法中,调用了processMailbox处理一定数量的消息,然后最终调用dispatcher的registerForEx ...

  5. akka设计模式系列(Actor模型)

    谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做<A Universal Modular Actor Formalism for Artificial Intellig ...

  6. Akka源码分析-Actor创建(续)

    在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...

  7. Akka源码分析-Actor发消息

    前面两篇文章简单介绍了ActorSystem.actor以及dispatcher和mailbox的创建,下面我们就来看一下actor发消息的内部机制. val system = ActorSystem ...

  8. Akka源码分析-Actor创建

    上一篇博客我们介绍了ActorSystem的创建过程,下面我们就研究一下actor的创建过程. val system = ActorSystem("firstActorSystem" ...

  9. scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

    參考代码: import scala.actors._ case class Person(name:String,age:Int) class HelloActor extends Actor{ d ...

随机推荐

  1. 商业规则引擎IBM WebSphere ILog JRules概述,开发基础教程

    Ilog Jrules开发基础教程有7篇,地址规则引擎Ilog Jrules开发基础教程[连载1]-- 概述篇 概述篇 规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来 ...

  2. 学会快速装系统 图解硬盘分区软件Norton Ghost使用

    http://edu.itbulo.com/200909/126313_5.htm即使你拥有最先进的电脑,采用传统的方法,Windows的安装速度仍然是令人头痛的!有没有什么重装系统的简便方法呢?当然 ...

  3. Android开发之Service的远程调用

    在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的 ...

  4. spring 4.0下集成webservice

    该教程使用的项目可参见: Intellij Idea下搭建基于Spring+SpringMvc+MyBatis的WebApi接口架构 具体源码请参见GitHub: https://github.com ...

  5. Python练习笔记——对输入的数字进行加和

    请您输入数字,每个数字采用回车结束,当您输入型号*时,则结束数字输入,输出所有数字的总和 def num_sum(): i = 0 while True: get_num = input(" ...

  6. python学习笔记012——pdb调试

    1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调 ...

  7. Linux卸载NAS磁盘,报device is busy

    # umount /data umount.nfs: /data: device is busy umount.nfs: /data: device is busy # fuser -m -v /da ...

  8. Linux内存初始化(二)identity mapping和kernel image mapping

    一.前言 本文没有什么框架性的东西,就是按照__create_page_tables代码的执行路径走读一遍,记录在初始化阶段,内核是如何创建内核运行需要的页表过程.想要了解一些概述性的.框架性的东西可 ...

  9. 采用dlopen、dlsym、dlclose加载动态链接库

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

  10. Unix环境高级编程(十一)线程

    一个进程在同一时刻只能做一件事情,线程可以把程序设计成在同一时刻能够做多件事情,每个线程处理各自独立的任务.线程包括了表示进程内执行环境必需的信息,包括进程中标识线程的线程ID.一组寄存器值.栈.调度 ...