【问题标题】:DDD\CQRS\ES Aggregate rehydrationDDD\CQRS\ES 骨料补液
【发布时间】:2021-02-24 12:50:51
【问题描述】:

当命令发出多个事件时,如何确保正确补液。将许多事件标记为原子更改的正确方法是什么

【问题讨论】:

    标签: domain-driven-design cqrs


    【解决方案1】:

    当应用所有可用事件时,补液完成。但是,当您的命令发出多个事件时,您只需确保这些事件在原子操作中保持在一起。

    例子:

    当前事件流:

    1. MyEvent1
    

    然后执行一个发出多个事件的命令:

    MyCommand emits ->
      MyEvent1
      MyEvent2
    

    这些事件将作为原子操作附加到事件流中。

    新事件流:

    1. MyEvent1
    2. MyEvent1
    3. MyEvent2
    

    现在,在为 Aggregate 补水时,您只需阅读整个 Event Stream 直到结束,就完成了。

    【讨论】:

      【解决方案2】:

      当命令发出多个事件时,如何确保正确补液。将许多事件标记为原子更改的正确方法是什么

      通常

      • 您的域逻辑返回一个事件序列
      • 您以原子方式将整个序列写入事件历史记录
      • 重构时,使用事件历史记录

      请注意,第二步意味着您的持久事件存储将支持事件序列的原子写入。

      注意:我们在重构领域模型的状态时通常不依赖广播机制,而是使用历史记录。

      在 CQRS 世界中,这将包括通过加载历史记录来创建读取模型,然后按照写入事件的固定顺序播放事件。

      【讨论】:

        【解决方案3】:

        这取决于您的底层存储。为不支持事务的持久存储实现原子写入的一种常见方法是创建一批事件并将其作为单个操作写入。

        在对事件进行再水化时,您可以将批次扁平化为扁平的事件序列/流,以构建您当前的状态。在补水期间,您真的关心所有事件,因为您将始终将下一个命令应用于完全补水的当前状态。因此,将批次保留在该点是没有意义的。

        如果您不想自己构建,有许多解决方案支持这样的状态写入/再水化。

        祝你好运

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 2017-05-12
          • 2018-06-24
          • 2018-09-02
          • 1970-01-01
          • 2015-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多