正如上一篇所描述的那样,通用编程实践并不能恰当地满足要求现代系统的需求。谢天谢地,我们不需要把我们所知道的全部都废弃了。相反,角色模型以一定原则方式解决这些缺点,让系统能够以更好的方式与我们的心智模式相匹配。角色模型抽象允许您从通信方面考虑您的代码,而不是像大型组织中的人之间发生的交换。

角色模型允许我们:

  • 强制封装而无需使用锁
  • 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展
  • 不要担心与我们的观念不匹配的执行机制。

消息传递的使用避免锁定和阻塞

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

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

传递消息和调用方法之间的一个重要区别是消息没有返回值。通过发送消息,Actor将工作委托给另一个Actor。正如我们在回调的错觉中看到的那样,如果它期望返回值,则发送方需要阻止或在同一线程上执行其他Actor的工作。相反,接收者将结果传递给回复消息。

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

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

总之,这是Actor收到消息时发生的事情:

  • Actor将消息添加到队列的末尾。
  • 如果Actor未安排执行,则将其标记为准备执行。
  • 调度程序接受Actor并开始执行它。
  • Actor从队列前面挑选消息。
  • Actor修改内部状态,将消息发送给其他Actor。
  • Actor是不定期的。

为了实现这种行为,Actor有:

  • 邮箱(邮件结束的队列)
  • 行为(Actor的状态,内部变量等)
  • 消息(表示信号的数据片段,类似于方法调用及其参数)
  • 执行环境(需要具有消息响应并调用其消息处理代码的actor的机制)
  • 地址(稍后会详细介绍)

消息进入Actor邮箱。该角色的行为描述了角色如何响应消息(比如发送更多消息和/或更改状态)。执行环境将线程池重新设置为完全透明地驱动所有这些操作。

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

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

Actor优雅地处理错误情况

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

  • 第一种情况是,由于任务中的错误(通常是某个验证问题,如不存在的用户ID),目标参与者上的委托任务失败。在这种情况下,由目标参与者封装的服务是完整的,只有任务本身是错误的。服务参与者应该给发件人回复一条消息,并给出错误情况。这里没有什么特别的地方,错误是域的一部分,因此成为普通消息。
  • 第二种情况是服务本身遇到内部故障。Akka强调所有的演员都被组织成一个树状的层次结构,也就是说,一个创造另一个演员的演员变成了那个新演员的父亲。这非常类似于操作系统如何将进程组织到树中。就像进程一样,当参与者失败时,它的父参与者会得到通知,它可以对失败做出反应。此外,如果父角色被停止,那么它的所有子元素也会被递归地停止。这项服务被称为监督。

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

下一章,让我们简要介绍一下Akka提供的功能。

原文:https://doc.akka.io/docs/akka/current/guide/actors-intro.html

有什么讨论的内容,可以加我公众号:

Akka适用于分布式系统《five》译相关推荐

  1. Actor模型与Akka

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

  2. 分布式系统一致性的发展历史 (二)

    2019独角兽企业重金招聘Python工程师标准>>> 在本系列第一篇文章中我们提到了Lamport Clock如何启发人们在分布式系统中开始使用新的的思维方式, 并介绍了Seque ...

  3. 加密算法、DES、IDEA、RSA、DSA

    加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密).加密技术的要点是加密算法, 加密算法可以分为对称加密.不对称加密和不可逆加密三 ...

  4. netty实现简单时事通讯_使用 RSocket 进行反应式数据传输

    在微服务架构中,不同服务之间通过应用协议进行数据传输.典型的传输方式包括基于 HTTP 协议的 REST 或 SOAP API 和基于 TCP 字节流的 gRPC 等.HTTP 协议的优势在于其广泛的 ...

  5. Disruptor面试宝典

    文章目录 Disruptor面试题 1.什么是 Disruptor?它有哪些特点? 2.Disruptor 如何实现无锁并发?它的核心原理是什么? 3.Disruptor 的优缺点是什么? 4.Dis ...

  6. URL 去重的 6 种方案!(附详细代码)

    来源 | Java中文社群(ID:javacn666) URL 去重在我们日常工作中和面试中很常遇到,比如这些: 可以看出,包括阿里,网易云.优酷.作业帮等知名互联网公司都出现过类似的面试题,而且和 ...

  7. 第二课_课后习题解答

    1.信息系统集成有哪些特点: 1.信息系统集成要以满足用户要求为根本出发点: 2.信息系统集成不只是设备选择和供应,更重要的它是具有高技术含量的工程过程,要面向用户需求提供全面解决方案,其核心是软件: ...

  8. 《kafka中文手册》-快速开始(二)

    Putting the Pieces Together 把各个块整合起来 This combination of messaging, storage, and stream processing m ...

  9. 2016年3月9日作业

    系统集成项目管理工程师教程 第三章 信息系统集成专业技术专业知识 3月9日作业 1.信息系统集成有哪些特点. 信息系统集成有以下几个显著特点. (1)信息系统集成要以满足用户需求为根本出发点. (2) ...

最新文章

  1. 基于OpenSSL安全会话的实现
  2. 图片上两点之间的距离和两组图片之间的差异的关系
  3. mysql主从数据库设计_mysql数据库主从库镜像原理及配置
  4. SAP UI5里一个包含众多操作的OData请求url实例
  5. java mifare_如何正确写入MifareUltralight NFC标签?
  6. vim 寄存器中的 ^@,^M,^J
  7. java markdown转word_一键将 Word 转换为 Markdown
  8. oracle新增表单,Oracle Retail(Retek)中Form生成列表方法总结
  9. python function terminated un_Python: 僵尸进程的产生和清除方法
  10. Windows Boot Manager改成中文菜单
  11. GB50311-2016标准综合布线
  12. MIPI.DSI.LCD點屏筆記_AT070TN92(800x480)_THC63LVDF84B_深圳富元智FX6
  13. 在linux上运行迷宫问题,C语言 迷宫问题(堆栈及其应用)
  14. stick棍子by Ye
  15. vue iframe 宽高自适应
  16. MapOnline在线地图插件V1.2上线
  17. Sallen-Key滤波器的详细介绍
  18. html网页div框架代码,div层仿网页框架布局特效代码
  19. 怎样将pdf文件转换成jpg文件
  20. 你以为ChatGPT真的听懂了你的话吗?

热门文章

  1. [转载] Python str title()方法
  2. [转载] 远程方法调用(RMI)与远程过程调用(RPC)
  3. Vivado中的Incremental Compile增量编译技术详解
  4. Kali下的内网劫持(一)
  5. java.util.HashMap
  6. 访问被拒绝:“Interop.jmail”
  7. Modules Of YoloV5 Architecture
  8. linux 内存 实例,linux内存地址分配(示例代码)
  9. java转型 内存_java 对象转型内存分析
  10. 安装i3_330mm长显卡,240水冷,我的第一款小钢炮,雷匠R-i3装机体验