微服务的 DDD 数据复制

DDD data duplication for microservices

我有用户、付款、产品、结帐服务。用户支付方式;付款人,产品;卖家,结帐:买家等。当新用户注册时。我发布包含用户的事件。并存储所有服务的用户数据。这意味着 15000 个用户是 X4 = 所有服务的 60.000 个用户数据。

可以吗?

或者我应该怎么做?

Is that Ok ?

所需数据的重复本身在我的point-of-view微服务架构中完全没问题,如果它发生在正确的理由。我什至一开始就不一定认为这是正常的数据重复。

每个微服务都有自己的域模型,因此 User 模型——您已经在不同的服务(付款人、卖家等)- 在不同的上下文中代表不同的东西。 用户服务.

甚至不知道每个服务中的那些用户对象也添加了数据

Or what should I do ?

...但是您仍然应该反思您的每项服务中用户数据的表示。甚至可能没有必要在创建用户后立即在您的每项服务中构建用户模型(卖家、买家等)的投影。

只有当我需要手头有一些用户信息时,我才会这样做,例如,当我必须执行一些域逻辑时的产品服务。您很有可能只需要您的一项服务中相应用户的 ID(或者说唯一的用户名)即可将用户连接到某个域实体。或者您甚至可以根据需要创建相应的用户对象,例如在结帐过程中。

我同意我的回答。

每个限界上下文 (BC) 中的域概念(在本例中为用户)的不同模型是可行的方法。在用户 BC 中,您拥有管理用户及其与任何其他 BC 无关的信息所需的模型。在其他 BC 中,您拥有买方的购买数据、卖方的销售数据和用户 BC 的参考 ID。现在,出于优化和隔离的原因,您可能会发现需要在 Payment BC 中复制一些 User BC 数据,以避免查询另一个 BC 来完成某些操作;然后复制就可以了

这是 DDD and/or 微服务中的黄金法则。不要尝试在多个 BC 中重用您的源代码模型(至少在默认情况下)。这也适用于 DDD 角色。领域概念(用户)可以在一个 BC 中充当聚合,在另一个 BC 中充当实体,在另一个 BC 中充当 VO;所以你需要在 3 个不同的 BC 中使用 3 个不同的模型。

另请记住,您的视图不是域操作。如果您必须显示(只是显示;如果您需要 BC 流程的规则和不变量的数据,那么此数据属于流程 BC;这可能导致可能的数据重复)您是支付 BC 流程中的用户 BC 数据允许查询 BC 或查询您为性能目的构建的非规范化 ReadModel 等