【问题标题】:Create a VO from a Entity从实体创建 VO
【发布时间】:2019-03-20 21:06:27
【问题描述】:
我正在使用 DDD 和事件溯源 (CQRS) 构建电子商务。我的想法是将微服务中的每个 AR 分开。
在我的 AR ShoppingCart 中,我需要一个带有 productId 和 Price 的 VO 项目,因为添加到购物车后价格不会改变。
我有另一个控制价格的 AR 产品。
我的问题是,由于我使用的是事件架构,如何在没有对产品的同步请求的情况下从 AR 产品中获取价格?
【问题讨论】:
标签:
domain-driven-design
microservices
event-sourcing
event-driven-design
【解决方案1】:
基本上,您要做的是将信息从一个聚合根复制到另一个。
您可以采用两种方法。
一种是从缓存的角度来考虑 - 我们将域服务的实例传递给购物车,该实例知道如何获取相关 ID(产品代码?)并获取价格的缓存副本。所以我们有一个后台进程,将定价信息从定价微服务复制到购物车微服务,然后自主购物车依赖其本地缓存的价格副本。
重要提示:在缓存中包含及时性元数据并没有错,这样锐化购物车可以包含有关缓存信息是否“太旧”的智能。
另一种更直接 - 有一种方法可以向购物车发送带有价格的命令,并构建一些编排逻辑来观察哪些购物车需要价格,然后向购物车发送带有价格的发送命令合适的价格。
【解决方案2】:
如果您有两个微服务,则可以让每个微服务发布一个事件流。您的 ShoppingCart 微服务可以使用 Product 微服务中的 PriceChanged 事件,并维护每个产品最后价格的本地缓存。当您将产品添加到 ShoppingCart 时,您将引用本地缓存的价格。
这种将事件侦听作为一种通信方式的相同方法从聚合间扩展到边界上下文间或微服务间甚至系统间。根据您对价格变化的敏感度,您可能必须采用所描述的其他方法,但我假设您在 CQRS+ES 模式中做出选择时对最终一致性有一定的容忍度。