Actor模型允许开发者:

  • 在不诉诸锁定的情况下实施封装。
  • 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展。
  • 不要担心与我们的世界观不匹配的执行机制。

(一) 消息传递的使用避免了锁定和阻塞

与方法调用不同的是,Actor相互发送消息。发送消息不会将执行线程从发送方传输到目标。Actor可以发送消息并继续而不会阻塞。因此,它可以在相同的时间内完成更多内容。

对于对象,当方法返回时,它释放对其执行线程的控制。在这方面,Actor的行为与对象非常相似,它们在完成处理当前消息时对消息作出反应并返回执行。通过这种方式,Actor实际上的执行与我们的设想是一致的。

Actor模型中第二个关键变化是恢复封装。Actors对消息作出反应,就像对象“响应”他们的调用的方法一样。不同之处在于,不是多个线程“突出”到我们的actor中并且对内部状态和不变量造成严重破坏,演员独立于消息的发送者执行,并且他们一次一个地顺序响应传入的消息。当每个actor按顺序处理发送给它的消息时,不同的actor彼此同时工作,以便actor系统可以同时处理尽可能多的消息,就像硬件支持的那样。

由于每个actor最多只能处理一条消息,因此可以保持actor的不变量而不进行同步。这种情况不使用锁

总的来说,Actors收到消息将会发生以下事情:

  1. Actor将消息添加到队列的末尾。
  2. 如果Actor处于未被调度状态,则将其标记为准备执行。
  3. (隐藏)调度程序实体,接受actor并开始执行它。
  4. Actor从队列前面挑选消息。
  5. Actor修改内部状态,将消息发送给其他actor。
  6. Actor状态标记为未被调度状态。

为了实现这些行为,演员有:

  • 邮箱(消息队列到达处)。
  • 行为(行为者的状态,内部变量等)。
  • 消息(表示信号的数据片段,类似于方法调用及其参数)。
  • 执行环境(需要具有消息响应并调用其消息处理代码的actor的机制)。
  • 地址
  • 消息进入actor邮箱。actor的行为描述了actor如何响应消息(比如发送更多消息和/或改变状态)。执行环境编排一个线程池,以完全透明地驱动所有这些操作。

这是一个非常简单的模型,它解决了以前列举的问题:

  • 通过将执行与信令解耦来保留封装(方法调用传输执行,消息传递不会)。
  • 没有锁。修改actor的内部状态只能通过消息进行,消息一次处理一次,在尝试保持不变量时消除竞争。
  • 在任何地方都没有使用锁,并且不会阻止发件人。可以在十几个线程上有效地安排数百万演员,充分发挥现代CPU的潜力。任务授权是演员的自然操作模式。
  • 参与者的状态是本地的而不是共享的,更改和数据通过消息传播,这些消息映射到现代内存层次结构实际上的工作方式。在许多情况下,这意味着只传输包含消息中数据的缓存行,同时保持本地状态和数据缓存在原始核心。相同的模型完全映射到远程通信,其中状态保存在机器的RAM中,并且更改/数据作为分组在网络上传播。

(二)Actor优雅地处理错误情况

由于我们不再在彼此发送消息的Actor之间拥有共享调用堆栈,因此我们需要以不同方式处理错误情况。我们需要考虑两种错误:

  • 第一种情况是目标Actor上的委托任务由于任务中的错误而失败(通常是一些验证问题,如不存在的用户ID)。在这种情况下,目标Actor封装的服务是完整的,只有任务本身是错误的。服务参与者应该使用消息回复发件人,并提供错误案例。这里没有什么特别的,错误是域的一部分,因此成为普通的消息。
  • 第二种情况是服务本身遇到内部故障。Akka强制所有Actor都被组织成一个树状的层次结构,即创建另一个Actor的Actor成为该新Actor的父级。这与操作系统将进程组织到树中的方式非常相似。就像进程一样,当一个Actor失败时,它的父Actor会得到通知,它可以对失败作出反应。此外,如果父actor已停止,则其所有子项也将以递归方式停止。这项服务被称为监督,它是Akka的核心。

主管(父母)可以决定在某些类型的故障中重新启动其子actor,或者完全阻止其他人。孩子们永远不会沉默地死去(除了进入无限循环之外),他们要么失败而且他们的父母可以对错误作出反应,要么他们被停止(在这种情况下,感兴趣的一方会自动得到通知)。总是有一个负责任的实体来管理一个Actor:它的父母。此外,重新启动对外部是看不到的:协作Actor可以在目标Actor重新启动时继续发送消息。

Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求相关推荐

  1. java actor_Java并发之actor模型

    Java并发之actor模型 Actor模型是一个概念模型,用于处理并发计算.它定义了一系列系统组件应该如何动作和交互的通用规则. 线程-对象模型的问题 锁和效率 OOP的核心特性是封装,封装规定对象 ...

  2. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  3. Akka之actor模型

    一 定义Actor import akka.actor.{Props, ActorSystem, Actor} import akka.actor.Actor.Receive import akka. ...

  4. Actor模型与Akka

    Actor模型与Akka 一. Actor模型 Actor模型概念 一个概念模型,用于处理并发计算 Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为, ...

  5. Akka并发编程——第六节:Actor模型(五)

    本章主要内容: 1. !消息发送,Fire-and-Forget消息模型 2. ?消息发送,Send-And-Receive-Future消息模型 Akka提供了两种消息模型:fire-and-for ...

  6. akka linux 端口,Actor模型开发库 Akka

    Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70 ...

  7. spark 如何用netty实现akka的actor模型

    Spark的中,通过netty实现了类似akka的actor机制. 在spark中,一个EndPointData就类似一个akka中的actor. private class EndpointData ...

  8. Actor 模型及Akka简介

    Actor 模型 Actor 的基础就是消息传递,一个 Actor 可以认为是一个基本的计算单元,它能接收消息并基于其执行运算,它也可以发送消息给其他 Actor.Actors 之间相互隔离,它们之间 ...

  9. scala之Akka的Actor模型(上)

    原文地址:http://my.oschina.net/jingxing05/blog/287213 明确并行和并发 看两张图 并行parallelism 并发concurrency 关键点在于 多个任 ...

最新文章

  1. 14岁上大学,29岁拿下教职,如今这位华裔学者拿下Jeffrey Elman大奖
  2. spring boot实战(第二篇)事件监听
  3. 【每周CV论文推荐】换脸算法都有哪些经典的思路?
  4. 全国计算机等级考试 架构师的设计模式
  5. ajax上传plupload的使用
  6. [C语言 - 12] Union联合
  7. IIS7.5和IIS8如何设置FTP的pasv端口范围
  8. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等
  9. python 给文本加下划线_untiy3dUGUI实现text文本下划线
  10. oracle循环视频教程,玩转Oracle入门知识和实战教程---韩顺平主讲(全31集)
  11. 自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读!
  12. java定时器quartz表达式,quartz定时任务cron表达式
  13. QLabel控件实现圆形头像显示
  14. 页面插件集成:博客详情页
  15. java计算机毕业设计Web医学院校大学生就业信息管理系统源码+mysql数据库+系统+lw文档+部署
  16. swift uikit
  17. 罗德里格斯旋转公式(Rodrigues‘ rotation formula)推导
  18. StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态
  19. QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】
  20. GRAIL Efficient Time Series Representation Learning论文阅读笔记(一)

热门文章

  1. 计算机里的dump是什么意思?(转储、转储文件)
  2. C语言 变量 函数 (类型、作用域、生命周期、存储位置)
  3. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 1.)(python/c/c++版)(笔记)
  4. 注意:python flask 里image文件 css文件 html文件都必须有固定存放位置!
  5. python 如何获取系统当前时间?datetime.datetime.now() 打印格式化时间(可用作文件名的格式化时间strftime)
  6. python numpy矩阵的旋转, 转置, 正对角线镜像, 副对角线镜像, 行交换, 列交换操作 rot90()
  7. WindowsServer2008防火墙配置命令
  8. A.M. Deviation 思维
  9. Divine Array 思维,模拟,结论
  10. 【Collection、泛型】