基于Akka的分布式领域驱动设计(DDD)

基于Akka的分布式领域驱动设计(DDD)

马草原 582 2021-09-04

基于Akka的分布式领域驱动设计(DDD)

当我们要使用Akka相关工具与技术时,可使用DDD来帮助我们设计Actor,设计组成整个系统的其它组件,将应用程序分隔为较小的系统的方式,了解子系统的边界以及它们如何交互。

DDD介绍

DDD是一套软件架构的指导原则,DDD中最重要的概念是域模型(Domain Model)。“域”是构成尝试建模的业务或领域的一组要求,约束和概念。DDD中,我们专注涉及的业务领域,并围绕它构建软件系统模型。

  • 构建DDD的过程需要该领域的专家参与进来,无需懂计算机,但可以通过我们开发的新语言相互交流
  • DDD专注于构建能持续发展的模型,不是一个一直都不变的模型

DDD好处

DDD可以帮助我们区分系统中的业务区域部分和基础架构部分,帮助我们争取的在它们周围创造正确的抽象层,这样就不会触及边界。

DDD的目标是将较大的领域业务分解成更小,更易于管理的业务块,然后分别对这些小的业务块进行构建,这样开发的系统不仅对我们更好理解,对领域专家来说也更好理解。

DDD组件

  • 域实体(Entity):实体一般是可以变的,具有唯一可识别的标识,可以直接映射到Akka actor中。actor就是管理可变状态的,并且系统中的actor都可以使用路径对其进行唯一标识。
  • 域值对象:值对象一般没有唯一标识,两者的值相同即认为是相同的,值对象是不可变的。可以作为Akka的消息。
  • 聚合:应用程序内对象的集合,每个聚合都会绑定到聚合根上,通过聚合根可以访问聚合中的一些元素。在Akka中就是父actor与子actor的关系。删除/停止父actor,子actor也会随之删除/停止
  • 仓储:仓储的目的是从基础架构中抽象出抽象层,创建一个将域和基础架构隔离开的系统,无需关系是使用SQL数据库,NoSQL数据库,数据文件或者其它结构。在Akka中有一组Person聚合,则可能有PersonRepository来管理这些聚合。PersonRepository应该也是一个actor。
  • 域服务:有些操作可能涉及到多个聚合根,这种情况下,我们可以引入一种被称为Service的概念。服务也是一个域对象,但是用于处理不适合作为聚合的操作,该服务可以根据需要与聚合进行交互。

有界上下文

任何有一定规模的系统都将自然分解为更小的组件,这些组件可以有自己的域,有自己的边界。

在Akka中,可以在系统中创建一系列顶级的Actor,让每一个actor专门用于一个特定的有界上下文,有界上下文标识彼此隔离的而服务。

这种有界上下文与现代微服务体系结构非常相似,这种情况下,每个微服务通常代表一个有界上下文。使用Akka Clustering,集群Sharding和Akka Http这样的工具可以将一个大型系统拆分为单独的有界上下文。

部署Actor的方式只是一个实现细节,而不是应用程序的固有部分,这样可以实现独立的缩放系统的不同部分

小结

了解Akka的Actor模型,并知道如何与DDD结合使用,就可以构建强大的、可扩展的、高度可维护的系统的必要组件,可以遵循这些已经建立好的模式保证系统的顺利构建。