演员模型(actor model)速览

2,206 阅读3分钟

演员模型是一个处理并发计算的概念模型。它定义了系统组件的行为和相互交互的规则。

Actors

在演员模型中,演员(actor)是运算的的基础单元,他承担接受消息和进行所需要执行的操作的任务。

actor之间彼此隔离,他们永远不会共享内存,并且actor可以维护一个永远不能被其他actor修改的私有状态

One ant is no ant

一个actor并不能成为actor模型。actor是系统的组件,在actor模型中认为一切都是actor,他们需要有地址,异变可以相互发送消息。

Actors have mailboxes

06094506_GM3W

理解这一点很重要,虽然actor是可以同时运行的,但是一个actor只会串行顺序处理接收到的消息。

消息会被异步的发往actor,然后存储到mailbox中,直到他们被处理。

What actors do

当一个actor接收消息时,通常做以下三件事情:

  • 创建更多的actors
  • 发送消息给其他actors
  • 指定如何处理接来下的消息

前两条很直观,是actors模型的特点,但是最后一点就很有意思了。

在前面说过,actor会维护一个私有状态,第三条的意思就是actor在准备处理接下来的消息前,他的这个私有状态如何改变。

我们来举个例子,假设actor是个计算器,它里面有个原始值为0,然后如果actor收到一个add(1)的消息,那么他会维护他的这个私有状态为1,但是没有立刻去修改actor里面的原始值,在接收下一条消息之前,他的私有状态便是1,然后等这些消息都收完,最后再用被隔离的私有状态里面的值修改actor里面的初始值,这样才最大限度的保护了数据的安全性。

Fault tolerance

Erlang 引入了“让它崩溃”的哲学。 这个想法是你不应该防御性地编程,试图预测可能发生的所有可能的问题并找到处理它们的方法,仅仅因为没有办法考虑每一个故障点。Erlang 所做的只是让它崩溃,但是让这个关键代码由一个人监督,这个人唯一的责任是知道当这个崩溃发生时该怎么做(比如将这个代码单元重置为稳定状态),而让这一切成为可能的就是演员模型(actor model)。

每段代码都是运行在某个进程中的。这些进程完全被隔离开来,以为这他们的状态将不会被其他进程影响。我们有一个监管者,仍然是一个进程(Actor),如果有进程崩溃了,监管者将采取相应的措施处理出错的情况。

这使得创建一个“自愈”的系统成为可能,也就是说,即使有actor出现异常并崩溃了,无论什么原因,一个监管者始终能够采取措施使得该actor重回正轨(有很多方法可以做这件事情,最简单直接的方式是重启actor的内部状态)。

Distribution

Actor 模型的另一个有趣方面是,我向其发送消息的 Actor 是在本地运行还是在另一个节点中运行并不重要。

想一想,如果一个actor只是一个带有邮箱和内部状态的代码单元,它只是响应消息,谁在乎它实际运行在哪台机器上? 只要我们能让消息到达那里,我们就没事。

这使我们能够创建利用多台计算机的系统,并帮助我们在其中一台发生故障时进行恢复。