将 Actor 模型与领域驱动设计(DDD)结合使用,你或许能够避免在传统的事件驱动或 Hexagonal 架构中所经常面对的一些架构上的负担。《Implementing Domain-Driven Design》一书的作者 Vaughn Vernon 最近在一个关于使用 Scala 与 Akka (Actor 模型的一种实现)进行响应式 DDD 编程的讲座中对这一话题进行了讲解。
人们最近经常使用的这个新术语“响应式”其实已经不是什么新鲜的概念了,许多人已经熟悉了对事件和消息进行响应的方式,但它在 DDD 中的应用却为我们习惯的方式带来了一些改变。在进一步进行解释之前,Vaughn 对 Actor 模型的一些基本特性进行了定义:
- 直接异步消息传递,它表示某个 Actor 以异步的方式直接向另一个 Actor 发送了一条消息。
- 无锁并行。Actor 不对锁进行处理,而是由基础架构进行处理。
- 无共享。Actor 互相之间对对方的内部状态一无所知。
促使 Vaughn 选择使用 DDD 方式的主要动机之一,是他希望以一种非常明确的方式对业务的核心部分进行建模。而在一个传统的事件驱动架构中,我们除了明确了领域模型的设计之外,领域事件同样也表现了一部分领域概念。这种方式依然没有达到完全的清晰化的目的,因为一旦领域事件被发布之后,要在代码中找出究竟在哪里对事件进行了响应,以及它最终对整个模型产生了怎样的影响,这并不是一件简单的事。
与事件驱动架构相反,Vaughn 发现 Actor 模型能够表现得非常明确。当某个 actor 向另一个 actor 发送消息,必须在代码中非常明确地表现出来。Vaughn 所面对的一个问题是,结合使用 Actor 模型与 DDD 能为我们带来多大的好处?难道好处仅仅是我们可以使用与以往相同的架构,在各个 Aggregate 之间发送消息而已吗?他对此疑问的回答是否定的,他相信这种方式可以使我们避免在传统的事件驱动或 Hexagonal 架构中所经常面对的一些架构上的负担。他认为只要有一种合适的框架,我们就可以将整个架构简单地分解为 Controller 和 Aggregate 两种组件,而 Actor 可扮演控制器的角色,它知道如何将消息发送给模型中的各个 Aggregate 以进行交互。
Vaughn 认为 Actor 模型与 DDD 的结合使用方式是没有什么限制的,对于任何需要实现高伸缩性、高可用性和低延迟的系统来说这一方式都是可用的。Akka 是基于 Java 虚拟机(JVM)编写的,不过 Vaughn 正在致力于实现 Akka.NET,它将把 Akka 移植到 C#和 F#语言上。
Vaughn 在今年早期对结合使用 Actor 模型与 DDD 的基础知识的发表了一份文章。
响应式宣言(Reactive Manifesto)于2013 年9 月发布,它描述了这个概念中包含的各种核心思想。
评论