domain-driven-design - 两个聚合之间的数据重复
问题描述
两个有界上下文,实现为微服务:
- 用户管理
- 会计
用户管理User
使用其、Name
等Email
托管聚合。
User
另一方面,一些sCustomer
在会计有界上下文中变为 s。它Customer
有自己的工作流程,因此它本身就是一个聚合。它的创建由UserRegistered
事件触发(发布/订阅机制)。
为了发送发票,会计需要Customer
. 我想知道电子邮件地址(其数据主人是User
)是否应该成为聚合的一部分Customer
,这将需要同步User
.
我倾向于认为更清洁的另一个解决方案是将email address
(及其更改)投影到Accounting中的readmodel。因此,聚合是其自身状态(例如支付工作流)的数据主控,但不是.Customer
User
你怎么看?一般来说,两个聚合之间的数据重复是一件坏事吗?
解决方案
你怎么看?一般来说,两个聚合之间的数据重复是一件坏事吗?
不。拥有一个“主”副本,由数据的权威拥有,多个从属副本并没有错。当权限完全在您的模型之外时,您的所有副本都可能从属于真正的权限。
数据的复制副本支持自治——即使主节点当前不可用,系统中的其他组件也可以继续使用它们的本地数据副本取得进展。
您确实希望在设计中多加注意——您的能力越接近所需数据的权威,您可能遇到的问题就越少。
(请记住,缓存失效是两个难题之一)。
这方面的一个简化示例可能是发票的已付款状态。您的履行系统可能需要知道发票是否已支付,然后才能发货。您的计费系统拥有已支付发票的决定。两者之间共享了一小部分信息。
但该数据的履行系统副本是次要的——履行系统无权拒绝已付发票。(当然,它可能有权提出异常报告“我们不能满足采购合同的要求”,或其他)。
推荐阅读
- python - Pycharm python解释器错误地显示错误
- javascript - 我需要一些帮助来减少运行测试的时间
- php - 更新关联数组的列不起作用
- c++ - 二叉搜索树插入数据问题
- java - 如何读取“params”数组中的任何一个
- java - 如何更改菜单项的文本大小?
- r - 是否有 R 函数可以导出相关矩阵中显示的相关性?
- c - 我在 stm32f103 上的 ILI9325 驱动程序在 Atollic TrueStudio 中工作,但在 Arduino IDE 中不起作用
- jenkins - 在 ansible playbook 运行后,热抑制来自 jenkins 管道的 BadExitStatusException 错误
- spring-boot - Wildfly 14上的战争部署中的Spring Boot 2 application.properties