我在前两篇文章中,带你一起学习了 MapReduce 和 Stream 计算模式,(分布式计算技术MapReduce 详细解读,分布式计算技术之流计算Stream,打通实时数据处理)相信你对批处理和流计算也有了一定的了解。虽然这两种计算模式对数据的处理方式不同,但都是以特定数据类型(分别对应静态数据和动态数据)作为计算维度。
在接下来两篇文章中,我将从计算过程或处理过程的维度,与你介绍另外两种分布式计算模式,即 Actor 和流水线。分布式计算的本质就是在分布式环境下,多个进程协同完成一件复杂的事情,但每个进程各司其职,完成自己的工作后,再交给其他进程去完成其他工作。当然,对于没有依赖的工作,进程间是可以并行执行的。
你是不是想说,分布式进程那么多,如果需要开发者自己去维护每个进程之间的数据、状态等信息,这个开发量可不是一般得大,而且特别容易出错。那么,有没有什么办法可以让开发者只关注自己的逻辑呢?
接下来,我们就一起打卡分布式计算模式中的 Actor 模式。
01
什么是 Actor?
Actor 类似于一个“黑盒”对象,封装了自己的状态和行为,使得其他 Actor 无法直接观察到它的状态,调用它的行为。多个 Actor 之间通过消息进行通信,这种消息类似于电子邮箱中的邮件。Actor 接收到消息之后,才会根据消息去执行计算操作.
那么,Actor 模型又是什么呢?Actor 模型,代表一种分布式并行计算模型。这种模型有自己的一套规则,规定了 Actor 的内部计算逻辑,以及多个 Actor 之间的通信规则。在 Actor 模型里,每个 Actor 相当于系统中的一个组件,都是基本的计算单元。
Actor 模型的计算方式与传统面向对象编程模型(Object-Oriented Programming,OOP)类似,一个对象接收到一个方法的调用请求(类似于一个消息),从而去执行该方法。
但是,OOP 因为数据封装在一个对象中,不能被外部访问,当多个外部对象通过方法调用方式,即同步方式进行访问时,会存在死锁、竞争等问题,无法满足分布式系统的高并发性需求。而 Actor 模型通过消息通信,采用的是异步方式,克服了 OOP 的局限性,适用于高并发的分布式系统。
举一个最简单的例子,假如你现在定义了三个对象 A、B 和 C,对象 C 中有一个函数 Function,现在对象 A 和对象 B 同时调用对象 C 中的 Function,此时对象 C 中的 Function 就成为了共享资源,有可能会存在竞争、死锁等问题。
而对于 Actor 模式,对象 A、B 和 C 对应着 Actor A、Actor B 和 Actor C,当 Actor A 和 Actor B 需要执行 Actor C 中的 Function 逻辑时,Actor A 和 Actor B 会将消息发送给 Actor C, Actor C 的消息队列存储着 Actor A 和 Actor B 的消息,然后根据消息的先后顺序,执行 Function 即可。
也就是说,Actor 模式采用了异步模式,并且每个 Actor 封装了自己的数据、方法等,解决了 OOP 存在的死锁、竞争等问题。
02
Actor 计算模式
接下来,我们再一起看看 Actor 计算模式吧。如下图所示,描述了具有 3 个 Actor 的 Actor 模型。

可以看到,Actor 模型的三要素是状态、行为和消息,有一个很流行的等式:Actor 模型 =(状态 + 行为)+ 消息。
接下来,我们一起看看这三要素的具体含义吧。
03
Actor 工作原理
为了方便你理解 Actor 的工作原理,我会通过讲述 3 个 Actor 之间基于消息和消息队列的工作流程进行说明。这 3 个 Actor 的工作流程,如下所示。

了解了 Actor 之间的消息交互和处理流程,我再以一个具体案例和你详细解读一下 Actor 之间的消息传递过程吧。

我们已经知道,在系统中,不同的组件 / 模块可以视为不同的 Actor。现在有一个执行神经网络的应用,其中有两个组件 A 和 B,分别表示数据处理模块和模型训练模块。假设,我们可以将组件 A 和 B 看作两个 Actor,训练过程中的数据可以通过消息进行传递。如上图所示,完整的消息传输过程为:
04
Actor 关键特征
通过上面的描述,可以看出 Actor 的通信机制与日常的邮件通信非常类似。因此,我们可以进一步总结出 Actor 模型的一些特点:
虽然 Actor 模型有上述的诸多优点,但它并不适用于分布式领域中所有的应用平台或计算框架。因为,Actor 模型还存在如下一些不足之处:
尽管 Actor 模型在需要同步处理的应用等场景具有局限性,但它在异步场景中应用还是比较广泛的。接下来,我们就一起看看 Actor 目前都应用在哪些地方吧。
05
Actor 模型的应用
Actor 模型在 1973 年被提出,已广泛应用在多种框架和语言中。可以说,很多框架或语言支持 Actor 编程模型,是为了给开发者提供一个通用的编程框架,让用户可以聚焦到自己的业务逻辑上,而不用像面向对象等编程模型那样需要关心死锁、竞争等问题。
那么,到底有哪些框架或语言支持 Actor 编程模型呢?将下来,我就和你列举几个典型的框架或语言吧,以方便你参考。
总结,今天,我与你介绍了分布式计算中,一门甩锅的计算模型,即 Actor 模型。
首先,我介绍了什么是 Actor 模型以及 Actor 模型的三要素,包括状态、行为和消息。
其次,我介绍了 Actor 的工作原理,并通过实例介绍了 Actor 之间通过消息及消息队列进行异步通信的流程,以便于你进一步理解 Actor 的工作原理。
最后,我为你介绍了几个当前支持 Actor 编程模型的框架和语言,以便于你在需要采用 Actor 模型编程时做一个参考。
最后,我再通过一张思维导图来归纳一下今天的核心知识点吧。

下一篇预告:分布式计算技术流水线
关于架构师修炼
本号旨在分享一线互联网各种技术架构解决方案,分布式以及高并发等相关专题,同时会将作者的学习总结进行整理并分享。
更多技术专题,敬请期待