代码之家  ›  专栏  ›  技术社区  ›  MatTheCat

如何存储sagas数据?

  •  1
  • MatTheCat  · 技术社区  · 7 年前

    据我所知,聚合只能包含用于保护其不变量的属性。

    现在我用一个传奇来模拟一个注册过程 RegistrationStarted ReserveEmail 将触发 EmailReserved 或 EmailReservationFailed

    我想使用 注册开始

    • 将这些数据存储在传奇中?但它们不是用来保护不变量的。
    • 把他们推过去 命令和结果事件?听起来很乏味。
    • 将传奇故事投射到阅读模式?最终的一致性呢?
    • 另一种方式?
    1 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    Rinat Abdullin wrote a good overview 传奇故事/ process managers .

    通常的答案是saga拥有它所关心的事件的副本,并使用这些事件中的信息来计算要发送的命令消息。

    List[Command] processManager(List[Event] events)
    

    是的,这是通常的方法;我们得到一份名单 [RegistrationStarted] ,我们用它来计算结果 [ReserveEmail] . 稍后,我们会 [RegistrationStarted, EmailReserved]

    数据必须以某种方式在两种能力之间传输。因此,您要么将数据从一条消息复制到另一条消息,要么复制一条消息 correlation identifier 从一条消息到另一条消息,然后允许使用者决定如何使用相关标识符来获取数据的副本。

    你通常会在传奇故事中存储事件(以跟踪发生的事情)。这将为您提供事件中提供的数据的副本。您没有要保护的不变量,因为您只是缓存所做决策的一个副本 . 通常不会运行进程管理器 查询 收集额外的数据。

    最终的一致性呢?

    如果我理解正确,我可以将我的传奇建模为一个注册聚合,存储所有事件,这些事件的相关标识符是它自己的标识符?

    乌迪大汉, writing about CQRS :

    推荐文章