温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家StarFork,纠错。

Actor 模型如何满足现代分布式系统的需求?

如前一主题「为什么现代系统需要新的编程模型」所述,常见的编程实践不能合适地满足现代系统的需求。幸运的是,我们不需要放弃我们所知道的一切。相反,Actor 模型以一种原则性的方式解决了这些缺点,允许系统以更好地匹配我们的构思模型(mental model)的方式运行。Actor 模型抽象允许你从通信的角度来考虑你的代码,这与大型组织中人员之间发生的交换没有什么不同。

使用 Actor 允许我们:

  • 在不使用锁的情况下强制封装。
  • 利用协同实体对信号作出反应、改变状态、相互发送信号的模型来驱动整个应用程序向前发展。
  • 不要担心执行机制与我们的世界观(world view)不匹配。

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

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

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

传递消息和调用方法之间的一个重要区别是消息没有返回值。通过发送消息,Actor 将工作委托给另一个 Actor。正如我们在「调用栈的假象」中看到的,如果它期望返回值,那么发送 Actor 要么阻塞,要么在同一线程上执行另一个 Actor 的工作。相反,接收 Actor 在回复消息中传递结果。

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

由于每个 Actor 最多只能同时处理一条消息,因此可以不同步地保留 Actor 的不变量。这是自动发生的,不使用锁:

总之,当 Actor 收到消息时会发生以下情况:

  1. Actor 将消息添加到队列的末尾。
  2. 如果 Actor 没有执行计划,则将其标记为准备执行。
  3. 一个(隐藏的)调度程序实体获取 Actor 并开始执行它。
  4. Actor 从队列前面选择消息。
  5. Actor 修改内部状态,向其他 Actor 发送消息。
  6. Actor 没有预约(unscheduled)。

为了完成上面的行为,Actors 有:

  • 一个邮箱(消息结束的队列)。
  • 一个行为(Actor 的状态、内部变量等)。
  • 消息(表示信号的数据片段,类似于方法调用及其参数)。
  • 一个执行环境(一种机制,它让具有消息的 Actor 对其消息处理代码作出反应并调用它们)。
  • 一个地址(稍后将详细介绍)。

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

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

  • 通过将执行与信号分离(方法调用转换执行权,消息传递不这样做),可以保留封装。
  • 不需要锁。修改 Actor 的内部状态只能通过消息来实现,一次处理一条消息,在试图保持不变时消除竞争。
  • 任何地方都没有使用锁,发送者也不会阻塞。数百万个 Actor 可以有效地安排在十几个线程上,从而充分发挥现代 CPU 的潜力。任务委托是 Actor 的天然执行方式。
  • Actor 的状态是本地的而不是共享的,更改和数据通过消息传播,消息是映射到现代内存架构的实际工作方式。在许多情况下,这意味着只传输包含消息中数据的缓存线,同时将本地状态和数据缓存在原始核心上。相同的模型可以完全映射到远程通信中,其中状态保存在机器的 RAM 中,更改/数据作为数据包在网络上传播。

Actor 能够优雅地处理错误情况

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

  • 第一种情况是,由于任务中的错误(通常是一些验证问题,如不存在的用户 ID),目标 Actor 上的委派任务失败。在这种情况下,由目标 Actor 封装的服务是完整的,只有任务本身是错误的。服务 Actor 应该用一条消息回复发送者,并显示错误情况。这里没有什么特别的,错误是域的一部分,因此错误也是普通消息。
  • 第二种情况是当服务本身遇到内部故障时。Akka 要求所有 Actor 都被组织成一个树形的结构,即一个创造另一个 Actor 的 Actor 成为新 Actor 的父节点。这与操作系统将流程组织到树中的方式非常相似。就像处理过程一样,当一个 Actor 失败时,它的父 Actor 会得到通知,并且它可以对失败做出反应。另外,如果父 Actor 被停止,那么它的所有子 Actor 也将被递归地停止。这项服务称为监督,是 Akka 的核心概念。

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

现在,让我们简单介绍一下 Akka 提供的功能。


英文原文链接:How the Actor Model Meets the Needs of Modern, Distributed Systems.


———— ☆☆☆ —— 返回 -> Akka 中文指南 <- 目录 —— ☆☆☆ ————

Akka 指南 之「Actor 模型如何满足现代分布式系统的需求?」相关推荐

  1. Akka 指南 之「Akka 简介」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. Akka 简介 欢迎来到 Akka,它是一组用于设计跨越处理器和网络的可扩展.弹性系统 ...

  2. Akka 指南 之「消息传递可靠性」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 消息传递可靠性 一般规则 讨论:"至多一次"是什么意思? ...

  3. Akka 指南 之「调度器」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 调度器 依赖 简介 默认调度器 查找调度器 为 Actor 设置调度器 调度 ...

  4. Akka 指南 之「集群客户端」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 集群客户端 依赖 简介 一个示例 ClusterClientReceptio ...

  5. Akka 指南 之「持久化」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 持久化 依赖 示例项目 简介 体系结构 事件源 标识符 恢复 恢复自定义 恢 ...

  6. Akka 指南 之「集群指标扩展」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 集群指标扩展 依赖 简介 指标收集器 指标事件 Hyperic Sigar ...

  7. Akka 指南 之「跨多个数据中心集群」

    温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 跨多个数据中心集群 动机 定义数据中心 成员关系 故障检测 集群单例 集群分 ...

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

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

  9. Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求

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

最新文章

  1. 施釉机器人_一种机器人自动施釉设备的制造方法
  2. 抽奖送福利|8大福利任性送,快来抽它
  3. mysql特有语法_MySQL 独有SQL语法汇总(一)
  4. Hadoop对小文件的解决方案
  5. 清除windows的EFS加密
  6. Hibernate课程 初探一对多映射3-3 单向多对一的测试
  7. 控制系统matlab仿真,控制系统MATLAB仿真作业
  8. Appium-Get Clipboard(获取剪贴板)
  9. Python超市进销存管理系统!老妈开超市有系统了!
  10. DNA甲基化可实现转座因子驱动的基因组扩增
  11. 计算机应用参考文献,计算机应用领域英文参考文献 哪里有计算机应用领域参考文献...
  12. matlab自动运行,自动运行matlab的方法步骤
  13. Linux下的文件及文件后缀名
  14. 什么 ? 陪玩都月入过忘拉~这不得python采集一下
  15. 手机QQ2008下载地址
  16. P3400 仓鼠窝 (单调栈 dp O(n*m
  17. 【毅力挑战】PCIe 每日一问一答(2022.12 已归档)
  18. C++ 大作业 记账本
  19. json格式的数据转化为字符串
  20. 计算机微机原理与接口技术课程设计课题,微机原理与接口技术课程设计报告

热门文章

  1. 弹弹堂之 弹坑技术
  2. 分享TDA2030A,2.1改2.0,加两颗4558D组成运放高,中,低调音(音调)电路
  3. 如何做小程序页面设计模板?
  4. finetune踩坑
  5. huya live source、douyu
  6. Shopify独立站中东市场怎么做
  7. 自然资源确权登记与不动产登记区别
  8. android里发送邮件mail的几种方式
  9. RL78/F13 在E2 studio(GCC)上的FLASH(FDL)读写应用
  10. vue 移动端 跳转页面_Vue移动端框架Mint UI教程-跳转新页面(四)