学习DDD和CQRS

时间:2018-09-25 17:27:20

标签: domain-driven-design microservices cqrs bounded-contexts

我是DDD和CQRS的新手,我打算构建一个简单的应用程序来提高我的技能。 我打算做的是一个简单的Taxi Corp应用程序。

要求:

  1. 客户订购出租车。
  2. 客户一次只能下一个订单。
  3. 驾驶员接订单。
  4. 驱动程序一次只能有一个订单。
  5. 驾驶员去找客户。
  6. 客户进入出租车。
  7. 课程开始。
  8. 课程结束。
  9. 购买客户并向驾驶员付款

以此类推。

我看到可以有三个汇总:客户,订单和驱动程序。我想将它们拆分为单独的微服务。您认为这是一个好主意,还是我应该从一个微服务入手?

我目前专注于订购出租车。首先,我需要检查客户是否尚未分配课程,以后可以创建订单。创建订单后,我需要将其分配给客户端。由于在一个请求期间只能更新/创建一个聚合,所以我想知道如何正确执行。我已经阅读了一些有关流程管理器的信息,我认为在这种情况下这将非常有用。我什至画了一个交流的模式。谁能告诉我我的方法是否正确,并给我一些进一步的建议?

Process of creating an order

4 个答案:

答案 0 :(得分:3)

  

您认为这是一个好主意,还是我应该从一个微服务开始?

我请您参考约翰·加尔的智慧

  

总是可以找到一个有效的复杂系统,它是从一个简单的有效系统演变而来的。从头开始设计的复杂系统永远无法运行,也无法进行修补以使其正常运行。您必须重新开始,首先要使用一个简单的系统。

不要担心微服务,而要关注消息

答案 1 :(得分:0)

有人说:“如果您拥有比客户更多的微服务,那就错了。”

如果您真的遵循CQRS / ES方法,那么与传统的ORM独角兽相比,生成的系统更容易拆分。

因此,首先要专注于领域,并从独一性开始。

答案 2 :(得分:0)

即使以错误的方式开始微服务设计,您也可以更好地了解所需的体系结构。因为微服务架构设计中的问题很快就会显现出来。

  • 客户端和驱动程序都是系统的用户,并且具有一些共性,因此您可以将它们视为一个域和一个微服务。

  • 考虑订单管理器微服务,以通过其ID将客户和驾驶员分配给行程。订单数据库可能包含行程表,该行程表具有用于驱动程序ID和客户端ID的两个ID键以及用于不同状态的一些列。完成每个行程后,您可以将其从行程表中删除并将其插入存档表中。另外,您可以将其保留在那里并每天对表进行分区,以保持较高的数据库性能。

  • 考虑一种会计微服务,用于保持付款和交易。如果您选择对其他微服务使用NoSql数据库,但对事务使用SQL数据库则可以。

  • 您可能需要另一个微服务来生成报告和仪表板。在新数据库中镜像其他数据库以进行报告。

  • 您还需要一个API网关才能将请求路由到微服务或进行身份验证

您的过程是一系列事件。当然,您将在以后扩展系统,并且可能会执行一些长期运行的任务,最好拥有一个消息代理,并使用事件源等模式将您的流程实现为事件/任务流。

答案 3 :(得分:0)

  

我看到可以有三个汇总:客户,订单和驱动程序。一世   想要将它们拆分为单独的微服务。你认为这是一个   好主意,还是我应该从一种微服务开始?

它们都属于同一个有界上下文。有限的上下文可以很好地转换为微服务(请参见Eric Evans视频:https://www.infoq.com/news/2015/06/dddx-microservices-boundaries)。但是,请不要从设计微服务开始,否则您将以错误的顺序进行操作。首先设计您的有限上下文,然后在有意义的情况下围绕六边形体系结构创建微服务。

  

创建订单后,我需要将其分配给客户端。如在   一个请求只能更新/创建一个聚合,我想知道如何   正确地做。

这是为什么您需要在同一过程中全部完成的完美示例。

但是,如果要使用多个微服务,请考虑最终的一致性(https://en.wikipedia.org/wiki/Eventual_consistency),并在服务之间创建消息驱动的体系结构。我认为可能工作量过多,但出于学习目的可能是个好主意。