【发布时间】:2021-07-26 12:17:57
【问题描述】:
我在 youtube 上阅读了很多关于聚合的文章和视频,但每次我都对它们感到更加困惑。所以请用一个具体的例子详细描述。我对此知之甚少,它是一个集合,它可以用于 DDD(域驱动设计)模式和识别微服务边界。如果我错了,请纠正我并描述更多关于聚合的信息。
提前致谢。
【问题讨论】:
标签: microservices domain-driven-design aggregates
我在 youtube 上阅读了很多关于聚合的文章和视频,但每次我都对它们感到更加困惑。所以请用一个具体的例子详细描述。我对此知之甚少,它是一个集合,它可以用于 DDD(域驱动设计)模式和识别微服务边界。如果我错了,请纠正我并描述更多关于聚合的信息。
提前致谢。
【问题讨论】:
标签: microservices domain-driven-design aggregates
AGGREGATE 是一组关联对象,我们将其视为一个单元,以便进行数据更改。 ——埃文斯,2003 年。
聚合是 Evans 在蓝皮书的生命周期管理章节中描述的一种模式。
动机是我们经常有两个或多个域实体,它们必须始终以某种方式相互一致。这通常意味着我们希望将它们保存在一起(否则,时间错误可能会使我们处于实体彼此不一致的状态),并且通常意味着我们希望在任何情况下都可以使用这两个实体我们可能会更改其中一个(因为我们需要确保更改与另一个一致)。
另请参阅:Coarse Grained Lock。
一个有点做作的例子:
想象一个跟踪某些商品的出价的系统。我们的实体可能包括一组 BUY 订单(每个订单都有价格和金额),以及类似的 SELL 订单集合。
我们的工作是配对彼此接近且时间相近且价格相同的买入和卖出订单。因此,当一个新的 BUY 订单进来时,它要么被添加到 BUY 订单集合中,要么与 SELL 订单匹配,后者从 SELL 集合中删除。
实际上,这两个集合的管理方式使它们永远不会重叠。为了确保属性成立,我们将两个集合保存在同一个“聚合”中,以便它们始终作为一个单元保存,并且我们可以避免可能使两个实体彼此不一致的数据竞争。
这通常会限制我们的数据模型 - 例如,如果我们使用文档存储来保存我们的域信息,那么这两个实体将在同一个“文档”中表示。
【讨论】: