Akka 指南 之「Actor 模型如何满足现代分布式系统的需求?」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家
Star
、Fork
,纠错。
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 收到消息时会发生以下情况:
- Actor 将消息添加到队列的末尾。
- 如果 Actor 没有执行计划,则将其标记为准备执行。
- 一个(隐藏的)调度程序实体获取 Actor 并开始执行它。
- Actor 从队列前面选择消息。
- Actor 修改内部状态,向其他 Actor 发送消息。
- 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 模型如何满足现代分布式系统的需求?」相关推荐
- Akka 指南 之「Akka 简介」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. Akka 简介 欢迎来到 Akka,它是一组用于设计跨越处理器和网络的可扩展.弹性系统 ...
- Akka 指南 之「消息传递可靠性」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 消息传递可靠性 一般规则 讨论:"至多一次"是什么意思? ...
- Akka 指南 之「调度器」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 调度器 依赖 简介 默认调度器 查找调度器 为 Actor 设置调度器 调度 ...
- Akka 指南 之「集群客户端」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 集群客户端 依赖 简介 一个示例 ClusterClientReceptio ...
- Akka 指南 之「持久化」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 持久化 依赖 示例项目 简介 体系结构 事件源 标识符 恢复 恢复自定义 恢 ...
- Akka 指南 之「集群指标扩展」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 集群指标扩展 依赖 简介 指标收集器 指标事件 Hyperic Sigar ...
- Akka 指南 之「跨多个数据中心集群」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star.Fork,纠错. 文章目录 跨多个数据中心集群 动机 定义数据中心 成员关系 故障检测 集群单例 集群分 ...
- 在.NET中实现Actor模型的不同方式
上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...
- Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求
Actor模型允许开发者: 在不诉诸锁定的情况下实施封装. 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展. 不要担心与我们的世界观不匹配的执行机制. (一) 消 ...
最新文章
- 施釉机器人_一种机器人自动施釉设备的制造方法
- 抽奖送福利|8大福利任性送,快来抽它
- mysql特有语法_MySQL 独有SQL语法汇总(一)
- Hadoop对小文件的解决方案
- 清除windows的EFS加密
- Hibernate课程 初探一对多映射3-3 单向多对一的测试
- 控制系统matlab仿真,控制系统MATLAB仿真作业
- Appium-Get Clipboard(获取剪贴板)
- Python超市进销存管理系统!老妈开超市有系统了!
- DNA甲基化可实现转座因子驱动的基因组扩增
- 计算机应用参考文献,计算机应用领域英文参考文献 哪里有计算机应用领域参考文献...
- matlab自动运行,自动运行matlab的方法步骤
- Linux下的文件及文件后缀名
- 什么 ? 陪玩都月入过忘拉~这不得python采集一下
- 手机QQ2008下载地址
- P3400 仓鼠窝 (单调栈 dp O(n*m
- 【毅力挑战】PCIe 每日一问一答(2022.12 已归档)
- C++ 大作业 记账本
- json格式的数据转化为字符串
- 计算机微机原理与接口技术课程设计课题,微机原理与接口技术课程设计报告
热门文章
- 弹弹堂之 弹坑技术
- 分享TDA2030A,2.1改2.0,加两颗4558D组成运放高,中,低调音(音调)电路
- 如何做小程序页面设计模板?
- finetune踩坑
- huya live source、douyu
- Shopify独立站中东市场怎么做
- 自然资源确权登记与不动产登记区别
- android里发送邮件mail的几种方式
- RL78/F13 在E2 studio(GCC)上的FLASH(FDL)读写应用
- vue 移动端 跳转页面_Vue移动端框架Mint UI教程-跳转新页面(四)