Axon - 订阅事件和跟踪事件处理器

问题描述 投票:1回答:1

我目前正在Axon中使用SubscribingEvent处理器。使用这个,一切都在单个线程中执行(因为我想执行命令并将事件应用于单个线程中的投影),确保所有内容都持久保存到DB或所有内容都回滚。

如果我们使用TrackingEvent处理器会发生什么情况,如果在Aggregate中成功执行该命令,并且聚合发出的事件被保留到DB,但是在投影完成之前应用程序失败(这意味着没有保存到DB)?重启后申请会继续预测此事件吗?

在我的情况下,我正在对REST调用进行投影,所以我想我使用SubscribingEvent处理器是有意义的(所以要么一切都好,要么就是没有)。如果我使用TrackingEvent处理器,应用程序在保存和投影之间崩溃 - 我会有不一致的状态。即使在下次启动时重新启动投影(我假设是这样),客户端也会再次发送相同的命令(认为它失败了),但如果第二次收到相同的命令会在聚合中发生什么?

java domain-driven-design cqrs event-sourcing axon
1个回答
1
投票

让我试着给你一些见解!

如果我们使用TrackingEvent处理器会发生什么情况,如果在Aggregate中成功执行该命令,并且聚合发出的事件被保留到DB,但是在投影完成之前应用程序失败(这意味着没有保存到DB)?

Axon的TrackingEventProcessor通过TrackingToken的方式记录它所处理的事件。跟踪处理器只会在调用所有事件处理组件(例如更新投影的组件)后更新TrackingToken。因此,在该时间点重新启动时,跟踪处理器将再次处理该事件。在这样做时,它会尝试与您的整个事件流保持同步。

如果我使用TrackingEvent处理器,应用程序在保存和投影之间崩溃 - 我会有不一致的状态。

这取决于您实施应用程序的方式。听起来一切都是紧密耦合的,并且这样做并不包含你必须处理最终一致性的事实。我知道说起来容易做起来难,但是当您发出命令时让前端不期望立即响应会最终简化系统。再说一次,这在很大程度上取决于你是否可以影响UI对事物的看法;不确定这是否适用于您的情况。

即使在下次启动时重新启动投影(我假设是这样),客户端也会再次发送相同的命令(认为它失败了),但如果第二次收到相同的命令会在聚合中发生什么?

这完全取决于您如何实施Aggregate。 Aggregate应该决定是否可以执行命令。如果该决策的一部分确保前一个命令与当前操作不同,那么您需要在@CommandHandler注释函数中考虑这一点。

我希望这能为你提供一些见解Bojan,并毫不犹豫地回答更多问题,以掌握Axon的这一部分。

© www.soinside.com 2019 - 2024. All rights reserved.