【问题标题】:Data duplication between two aggregates两个聚合之间的数据重复
【发布时间】:2019-06-25 03:50:58
【问题描述】:

两个有界上下文,实现为微服务:

  • 用户管理
  • 会计

用户管理托管聚合User及其NameEmail等。

另一方面,一些Users 在Accounting 有界上下文中变为Customers。 Customer 有自己的工作流程,因此它本身就是一个聚合。它的创建由UserRegistered 事件触发(发布/订阅机制)。

为了发送发票,会计需要Customer的电子邮件地址。我想知道电子邮件地址(其数据主控是User)是否应该成为聚合Customer 的一部分,这将需要同步User 的每个电子邮件地址更改。

另一个我倾向于认为更简洁的解决方案是将email address(及其更改)投影到Accounting中的readmodel。因此,聚合 Customer 是其自身状态(例如支付工作流)的数据主控,但不是 User 已经给出的数据。

你怎么看?一般来说,两个聚合之间的数据重复是一件坏事吗?

【问题讨论】:

标签: domain-driven-design cqrs


【解决方案1】:

你怎么看?一般来说,两个聚合之间的数据重复是一件坏事吗?

没有。拥有一个“主”副本(由数据的权威拥有)和多个从属副本并没有错。当权限完全在您的模型之外时,您的所有副本都可能从属于真正的权限。

数据的复制副本支持自主性——即使主节点当前不可用,系统中的其他组件也可以继续使用它们的本地数据副本取得进展。

您确实希望在设计时多加注意——您的能力越接近所需数据的权威,您可能遇到的问题就越少。

(请记住,缓存失效是两个难题之一)。

这方面的一个简化示例可能是发票的已付款状态。您的履行系统可能需要知道发票是否已支付,然后才能发货。您的计费系统拥有已支付发票的决定。两者之间共享一小部分信息。

但该数据的履行系统副本是从属的——履行系统无权拒绝已付发票。 (当然,它可能有权提出“我们不能满足采购合同的要求”等异常报告。

【讨论】:

  • 正如我所说,基于 readmodel 的副本是我想要的。我说的是在不同的聚合中复制数据,而不是预测。
  • 我也是。没有理由一个聚合不应该保存其他地方拥有的数据的缓存副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2021-02-16
  • 2020-04-25
  • 1970-01-01
  • 2014-04-10
相关资源
最近更新 更多