【问题标题】:In CQRS (event-sourced), do you need a global sequence counter in the event store?在 CQRS(事件源)中,您是否需要事件存储中的全局序列计数器?
【发布时间】:2010-06-01 09:21:35
【问题描述】:

在尝试了解 CQRS(以及一般的 DDD)时,我遇到了以下情况:两个事件发生在不同的聚合上,但它们的顺序具有领域意义。如果是这样,那么它们可能发生得如此紧密,以至于时间戳(正如我所看到的示例实现所使用的)无法区分它们,这意味着事件存储不包含域的“完整”表示,因为顺序存在歧义发生了哪些事件。

例如,域可以触发CustomerCreatedEvent 应用于Customer 聚合,然后在Agent 聚合上触发CustomerAssignedToAgent 事件。如果CustomerAssignedToAgent 事件发生在CustomerCreatedEvent 之前,则它没有意义,但通常这两个事件都可能由于一个操作而被触发,这使得时间戳可能实际上是相同的。

所以我只是在建模不好?是否应该存在跨不同聚合的事件顺序很重要的情况?或者您应该在事件存储中保留一个全局序列号,以便您可以识别事件发生的确切顺序?

【问题讨论】:

    标签: domain-driven-design cqrs


    【解决方案1】:

    一般来说,强制执行全局秩序是个坏主意。聚合旨在形成 ACID 语义边界。

    这意味着不应在一个事务中更新两个聚合,并且没有其他方法可以强制执行全局顺序。

    在您的情况下,在创建 CustomerCreatedEvent 的同时,客户应该向代理聚合发送一条消息,告诉它分配自己。一般来说,聚合之间的通信应该通过消息传递来完成。

    【讨论】:

    • 感谢 Szymon,我认为这是最有可能的情况!
    • 我已经读过很多次了,但是......当您使用 EventStore 作为队列来使用来自其他有界上下文的事件时,甚至对于生成它们的同一个 BC,如何你确定你把它们整理好了吗?您不需要以非常严格的顺序使用它们,但您至少需要能够从给定的偏移量中使用它们。
    【解决方案2】:

    我还在 domaindrivendesign yahoo 列表中找到了this post by Greg Young

    只有在聚合根边界内的每个处理程序才能保证顺序。

    处理程序之间或聚合之间的顺序无法保证。

    试图提供这些东西会导致阴暗面。

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2023-04-08
      • 2020-02-21
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多