2

我有一个系统,其中包含customer实体和user实体。使用微服务期间的步骤向导UI

Customer是一个谁付钱。每个客户包含1-N个用户。客户有链接到用户。

User没有客户就不能存在。用户实体包含CustomerId。

问题是我被限制使用特定的UI来创建客户。客户创造的过程包括在UI 2步:

  • 填写有关客户的信息:名字,姓氏,地址等
  • 第二步为客户创造用户。

主要想法是在步骤2结束时创建客户和用户。如果我可以将两个实体都存储在同一个数据库中,那将很简单。我可以在一次ACID交易中完成。这将节省所有或没有。

不幸的是,我使用微服务 - 客户和用户是与自己的存储不同的微服务。两个存储都不是数据库 - 存储没有事务选项。所以Customer实体使用存储1和User实体使用存储2.

我建议在第一步后保存客户。然后在第二步之后保存用户。但是在第二个用户界面步骤中有一个取消按钮,该按钮应删除在整个过程中创建的所有用户和客户。建议被拒绝。 问题是,如果具有特定用户名的用户已经存在,我不应该保存,也不应该保存客户,也不应该保存用户。

我的问题是:

  • 多少RootAgregates我有吗?一个或两个?
  • 将用户存储在与客户存储不同的存储中是否正确?
  • 这种情况下正确的做法是什么?

P.S.我不喜欢将用户保存在客户中的想法。在惹恼用户的情况下,我需要与客户合作。另一个问题是我需要用户在整个系统中是唯一的,并且需要获得所有用户的列表。

P.S.我用户Azure服务结构和演员模型。

+1

好吧,看起来你的服务边界可能是错误的,如果你想要强一致性。否则,你只能希望最终的一致性。基本上你应该有一些东西(例如进程管理器)来跟踪整个进程并消耗事件从一个状态转换到另一个状态。 – plalx

回答

1

我有几种RootAgregate?一个或两个?

  • 您有一个聚集根和一个实体。

是它来存储用户在不同的存储比 客户存储一个正确的做法?

  • 不,它不是。因为你应该每个聚合都有一个仓库。

看看Effective Aggregate Design by Vaughn Vernon如何设计聚合。