【发布时间】:2018-11-07 00:46:11
【问题描述】:
根据我的阅读,聚合必须只包含用于保护其不变量的属性。
我还读到 sagas can be aggregates 这对我来说很有意义。
现在我使用 saga 模拟了一个注册过程:在RegistrationStarted 事件上,它发送一个ReserveEmail 命令,如果电子邮件是免费的,它将触发EmailReserved 或EmailReservationFailed。然后,侦听器将发送验证链接或通知帐户已存在的消息。
我想在此侦听器中使用来自 RegistrationStarted 事件的数据(例如 IP 和用户代理)。我该怎么做?
- 将这些数据存储在 saga 中?但它们不用于保护不变量。
- 通过
ReserveEmail命令和结果事件推动他们?听起来很乏味。 - 将 saga 投影到读取模型?那么最终的一致性呢?
- 另一种方式?
【问题讨论】:
-
我将 saga 视为可以发出命令的读取模型。在这种情况下,您究竟看到了哪些一致性问题?
-
假设
EmailReserved事件是在预测传奇之前发布的;我无法获得RegistrationStarted数据。 -
它应该像任何其他读取模型一样工作:创建 saga 时,它应该重播所有感兴趣的事件,直到它进入“当前”状态,然后监听传入事件。当然在重播期间它不应该发送命令,只是更新它的状态
-
我真的不明白;您可以尝试在答案中阐述您的观点吗?
-
好的,我会尽量给出完整的答案。但是然后我需要了解您的示例中的聚合根是什么,以及它需要什么来决定保留是成功还是失败?它需要知道其他预订的结果吗?
标签: cqrs event-sourcing aggregateroot saga