Vaughn Vernon 论 Actor 模型和领域驱动设计

  • Jan Stenberg
  • 赵震一

2013 年 6 月 18 日

话题:架构

为了更好地把握新型多核机器带给我们的超大并发能力的机会,我们应该使用一种能帮助我们达成该目的的编程模型,而Actor 模型带给了我们大量的工具来实现这一点。Implementing Domain-Driven Design一书的作者Vaughn Vernon在今年伦敦的DDD Exchange Day 大会上对此进行了阐述

Actor 模型之所以还没有流行起来的一个原因也许就是因为我们从未真正有过拥有超强并发计算能力机器的机会。而现在,我们的机器都拥有着大量的核。因为这些改变,我们对并发的规模和使用都将与从前截然不同。因此,Vaughn 认为我们应该着眼于 Actor 模型,它可以给与我们大量的工具来达成我们的目的。

直接异步消息传递

由于 Actor 的消息是异步发送的,所以当一个 actor 向其他 actor 发送完消息后可以马上继续工作。唯一需要的便是消息接收者的地址,消息发送者可以通过创建 actor 或从已收到的消息中获取地址。

无锁并发(Lock Free Concurrency)

为了避免加锁,Actor 模型通过加强队列来实现并发,这意味着一个 actor 同一时间只能处理一个消息,但是这无法确保消息接收的顺序。

无共享(Share nothing)

Actor 是计算的主要单元,因此每个独立的 actor 将自己的状态完全封装,没有状态是共享的。Actor 只能以不可变的方式返回数据。

Future 与承诺

当查询以异步的方式传递后,结果将在将来的某个时间被异步返回。当消息被发送后,一个 Future 对象将立即返回,它代表了对结果的承诺。

Actor模型和领域驱动设计

Actor 模型非常适合领域驱动设计,消息代表了通用语言(ubiquitous language)这一概念,并且使用aggregate来作为 actor。消息可以直接发送到 aggregate,而业务规则将适用于 aggregate,而实体也将持久化在 aggregate。这样也自然适用于在一个事务中应该只有一个 aggregate 被修改这一原则。Vaughn 认为通过去除当今典型事件驱动架构中的部分复杂性将可以简化我们的实现。

Actor模型

在 Actor 模型中,每个对象都是一个具有邮箱(mailbox)和行为的 actor,消息将通过邮箱在 actor 之间交换。Actor 之间的通信都是异步执行的,并且没有状态共享。

今年早些时候,Eric Meijer 、Actor 模型的创造者Carl Hewitt以及Clemens Szyperski在白板前的一个站立交流中讨论并解释了 Actor 模型。

查看英文原文:Vaughn Vernon on the Actor Model and Domain-Driven Design

架构