【发布时间】:2020-02-04 04:44:47
【问题描述】:
在基于 CQRS / ES 的系统中,您将事件存储在事件存储中。这些事件引用一个聚合,并且它们相对于它们所属的聚合具有顺序。此外,聚合是一致性/事务边界,这意味着任何事务保证仅在每个聚合级别上给出。
现在,假设我有一个读取模型,它使用来自 多个 聚合的事件(这很好,AFAIK)。为了能够以确定的方式重放读取模型,事件需要某种全局排序,跨聚合 - 否则您将不知道是在 B 之前还是之后重放聚合 A 的事件,或者如何混合他们。
实现此目的的最简单解决方案是在事件上使用时间戳,但通常时间戳不够精细(或者,换句话说,并非所有数据库都是平等的)。另一种选择是使用全局序列,但这在性能方面很差,并且会阻碍扩展。
你如何解决这个问题?或者是我的基本假设,即读取模型的重放应该是确定性的,错了吗?
【问题讨论】:
-
你能举一个例子,说明什么时候聚合 A 在聚合 B 之前重播很重要?
-
假设您有两个聚合,
group和user,并且用户可以是组的一部分。当然,您不希望组和用户成为同一聚合的一部分,因为这会大大减少软件的并行使用。但是,在用户能够加入组之前,该组必须存在。虽然这可以在写入端轻松解决,但如何决定在读取端以何种顺序重播组和用户的事件,以避免在groups of each user视图中尝试将组添加到用户记录中用户还没到? -
@GoloRoden(删除了我之前的评论,因为我想我没理解) - 在我们自己的实现中,我们在事件存储中使用了流名称,并且能够为一组特定的流重放事件,从而允许我们控制命令。即: $ce-groups 然后 $ce-users 等...
-
@Nope 好的,但是你是自动计算出这个顺序,还是开发人员必须定义的东西?
标签: cqrs event-sourcing