1.Actor模型

在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成

  1. 状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
  2. 行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态
  3. 邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息

Actor的基础就是消息传递

2.使用Actor模型的好处:

  1. 事件模型驱动--Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情
  2. 强隔离性--Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要
    观察到另一个Actor的状态变化只能通过消息传递进行询问
  3. 位置透明--无论Actor地址是在本地还是在远程机上对于代码来说都是一样的
  4. 轻量性--Actor是非常轻量的计算单机,单个Actor仅占400多字节,只需少量内存就能达到高并发

3.Actor模型原理

以下通过学生与教师之间的邮件通信来理解akka中的Actor模型

学生-教师的消息传递

首先先只考虑学生单向发送消息给教师(学生--->教师),如下图:

图解:

  1. 学生创建一个ActorSystem
  2. 通过ActorSystem创建ActorRef,将QuoteRequest消息发送到ActorRef(教师代理)
  3. ActorRef(教师代理)消息传递到Dispatcher中
  4. Dispatcher依次的将消息发送到TeacherActor的邮箱中
  5. Dispatcher将邮箱推送到一条线程中
  6. 邮箱取出一条消息并委派给TeacherActor的receive方法

下面再详细的解释每一步骤

StudentSimulatorApp主程序详解:

首先StudentSimulatorApp会先启动JVM并初始化ActorSystem

如上图所示,StudentSimulatorApp的主要工作为:

  1. 创建ActorSystem

    • ActorSystem作为顶级Actor,可以创建和停止Actors,甚至可关闭整个Actor环境,
      此外Actors是按层次划分的,ActorSystem就好比Java中的Object对象,Scala中的Any,
      是所有Actors的根,当你通过ActorSystem的actof方法创建Actor时,实际就是在ActorSystem
      下创建了一个子Actor。
      可通过以下代码来初始化ActorSystem

      val system = ActorSystem("UniversityMessageSystem")

  2. 通过ActorSystem创建TeacherActor的代理(ActorRef)
    • 看看TeacherActor的代理的创建代码

      val teacherActorRef:ActorRef = system.actorOf(Props[TeacherActor])

    ActorSystem通过actorOf创建Actor,但其并不返回TeacherActor而是返
    回一个类型为ActorRef的东西。
    ActorRef作为Actor的代理,使得客户端并不直接与Actor对话,这种Actor
    模型也是为了避免TeacherActor的自定义/私有方法或变量被直接访问,所
    以你最好将消息发送给ActorRef,由它去传递给目标Actor

  3. 发送QuoteRequest消息到代理中
    • 你只需通过!方法将QuoteReques消息发送给ActorRef(注意:ActorRef也有个tell方法,其作用就委托回调给!)

      techerActorRef!QuoteRequest
      等价于teacherActorRef.tell(QuoteRequest, teacherActorRef)

完整StudentSimulatorApp代码

object StudentSimulatorApp extends App{
 //初始化ActorSystem
 val actorSystem=ActorSystem("UniversityMessageSystem")
 //构建teacherActorRef
 val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
 //发送消息给TeacherActor
 teacherActorRef! QuoteRequest
 Thread.sleep (2000)
 //关闭 ActorSystem,如果不关闭JVM将不会退出
 actorSystem.shutdown()
}

QuoteRequest类

object TeacherProtocol{
 case class QuoteRequest() //请求
 case class QuoteResponse(quoteString:String) //响应
}

Dispatcher和MailBox

ActorRef将消息处理能力委派给Dispatcher,实际上,当我们创建ActorSystem和ActorRef时,
Dispatcher和MailBox就已经被创建了

  • MailBox

    • 每个Actor都有一个MailBox,同样,Teacher也有个MailBox,其会检查MailBox并处理消息。
      MailBox内部采用的是FIFO队列来存储消息,有一点不同的是,现实中我们的最新邮件
      会在邮箱的最前面。
  • Dispatcher

    • Dispatcher从ActorRef中获取消息并传递给MailBox,Dispatcher封装了一个线程池,之后在
      线程池中执行MailBox。

      protected[akka] override def registerForExecution(mbox: Mailbox, ...): Boolean = {
        ...
       try {
       executorService execute mbox
       ...
      }

    • 为什么能执行MailBox?
      • 看看MailBox的实现,没错,其实现了Runnable接口

        private[akka] abstract class Mailbox(val messageQueue: MessageQueue) extends SystemMessageQueue with Runnable

TeacherActor

当ActorRef发送消息调用目标Actor的reveive方法时,MailBox中的run方法被执行,接着从消息队列中取出一条消息并传递给Actor处理

class TeacherActor extends Actor {
 val quotes = List(
  "Moderation is for cowards",
  "Anything worth doing is worth overdoing",
  "The trouble is you think you have time",
  "You never gonna know if you never even try")
 def receive = {
  case QuoteRequest => {
  import util.Random
  //从list中随机选出一条消息作为回应(这里只print并没回应学生的请求)
  val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
  println (quoteResponse)
  }
 }
}
TeacherActor的receive方法将匹配QuoteRequest消息

参考文章: 

https://rerun.me/tag/akka/page/2/

每天一点成长,欢迎指正!

Actor模型及原理相关推荐

  1. actor 模型原理 (一)

    actor模型很牛逼,很流行,但是我不会,妈的,国内搜出来的讲解actor的都看不太懂,讲不太清,下面哥们就翻译一下老外的文章,以粗浅的方式体会一下到底什么是actor模型? 多线程开发要处理并发,锁 ...

  2. actor 模型原理 (二)

    现在开始研究一下akka的actor模型是怎么实现的: 老外写了一个程序说明actor的工作机制,下图就是学生给老师发邮件的具体示意图,那么1-6一共6个步骤 1.学生创建actor system , ...

  3. golang actor模型探索

    Actor模型原理 漫谈并发编程:Actor模型 https://www.jianshu.com/p/db04cab86ab9 AsynkronIT/protoactor-go 十分钟理解Actor模 ...

  4. 为什么Actor模型是高并发事务的终极解决方案?

    首先看看道友提出的一个问题: 用户甲的操作 1.开始事务 2.访问表A 3.访问表B 4.提交事务 乙用户在操作 1.开始事务 2.访问表B 3.访问表A 4.提交事务 如果甲用户和乙用户的两个事务同 ...

  5. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码

    原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...

  6. 【经典书】概率图模型:原理与技术

    来源:专知 本文为书籍,建议阅读5分钟概率图模型将概率论与图论相结合,是当前非常热门的一个机器学习研究方向. 概率图模型将概率论与图论相结合,是当前非常热门的一个机器学习研究方向.<概率图模型: ...

  7. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  8. BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图

    BC之SC:区块链之智能合约--与传统合约的比较以及智能合约模型部署原理.运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理.运行原理 SC与传统合约的比较 1.传统合约VS智能合约  特 ...

  9. java actor模型实例,详解Theron通过Actor模型解决C++并发编程的一种思维

    现今,单台机器拥有多个独立的计算单元已经太常见了,这点在服务器的处理器上表现尤为明显,据AMD的一张2012-2013服务器路线图显示,服务器处理器的核心数将在2013年达到20颗之多,合理的利用CP ...

最新文章

  1. “奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”
  2. VMware中Ubuntu系统不全屏问题
  3. 基于JSP/SERVLET的省心物流管理
  4. [Android]实现类似微信的延迟加载的Fragment——LazyFragment
  5. python软件下载安装要钱吗-PyCharm下载和安装详细步骤
  6. python获取动态数据采集仪代理_Python3爬虫技术文档(3)——动态页面数据采集,三,获取...
  7. python2.7输入函数_Python2.7的用户输入函数有问题,无法让这些输入与程序一起工作...
  8. airpassengers数据集_12个Pandas amp;amp; Numpy函数:数据分析提速50%不是问题!
  9. IT女性必备——5个方法变身小腰精
  10. OpenBSD操作系统(1)——服务管理程序rcctl 类似linux下的service或systemctl
  11. 好看的2020年html倒计时源码
  12. 山特服务器硬盘480g,【02311VHS N480SSDW2SPA 480GB SATA SSD 华为服务器固态硬盘】价格_厂家 - 中国供应商...
  13. 计算机光驱故障分析,光驱故障示例解决
  14. 推荐电影电视剧下载最好去处
  15. Office Word 2016 中Word自带公式编辑器编辑的公式转Mathtype出现omml2mml.xsl 问题的解决方法
  16. docker 入门优质文章
  17. DeepLab语义分割
  18. 做回归分析时import ConvergenceWarning出错的问题
  19. U-Boot1.2.0移植YC2440
  20. 基于STM32f103的电子秤系统设计

热门文章

  1. kali linux查看系统版本、内核
  2. 微软补丁服务器分组审批,Windows Server WSUS PowerShell 拒绝审批取代补丁脚本 | 庞展博客...
  3. 项目1在线交流平台-3.开发交流社区核心功能模块-7.显示私信信息
  4. 28、Java——汽车租赁系统(对象+XML)
  5. Python CSV Reader/Writer 例子
  6. 文墨绘学一千万也换不来一个好孩子
  7. 如果只能推荐一本 Python 书,我一定 Pick 它
  8. 实践 贪吃蛇游戏开发
  9. color demura原理_demura
  10. 深度学习主机配置推荐