【发布时间】:2018-03-14 21:51:57
【问题描述】:
所以我试图弄清楚 CQRS+ES 架构的一般用例背后的结构,我遇到的问题之一是聚合在事件存储中的表示方式。如果我们将事件分成流,流到底代表什么?在一个假设的库存管理系统的上下文中,该系统跟踪一组项目,每个项目都有一个 ID、产品代码和位置,我在可视化系统布局时遇到了麻烦。
根据我在互联网上收集到的信息,可以简洁地描述为“每个聚合一个流”。所以我会有一个 Inventory 聚合,一个带有 ItemAdded、ItemPulled、ItemRestocked 等事件的单个流,每个事件都带有包含 Item ID、数量变化、位置等的序列化数据。聚合根将包含 InventoryItem 对象的集合(每个都有它们各自的数量、产品代码、位置等)这似乎可以轻松执行域规则,但我看到了一个主要缺陷;将这些事件应用于聚合根时,您必须首先重建该 InventoryItem 集合。即使使用快照,对于大量项目,这似乎也是非常低效的。
另一种方法是让每个 InventoryItem 有一个流来跟踪与唯一项目相关的所有事件。每个流都以该项目的 ID 命名。这似乎是更简单的路线,但现在您将如何执行域规则,例如确保产品代码是唯一的,或者您不会将多个项目放在同一个位置?看起来您现在必须引入 Read 模型,但将命令和查询分开不是重点吗?就是感觉不对。
所以我的问题是“哪个是正确的?”部分两者兼而有之?两者都不?像大多数事情一样,我学的越多,我不知道的就越多……
【问题讨论】:
-
对我来说,如果您在一个聚合中遇到太多事件的问题,这表明您需要重新考虑您的界限。
标签: domain-driven-design cqrs event-sourcing