Axon - SubscribingEvent 与 TrackingEvent 处理器

Axon - SubscribingEvent vs TrackingEvent processor

我目前在 Axon 中使用 SubscribingEvent 处理器。使用它,一切都在单线程中执行(因为我想在单线程中执行命令并将事件应用于投影)确保一切都持久化到数据库或一切都回滚。

如果我们使用 TrackingEvent 处理器会发生什么情况,如果该命令在聚合中成功执行并且聚合发出的事件保存到数据库中,但应用程序在投影完成之前失败(这意味着未保存到数据库中) ?重启后应用会继续投射这个事件吗?

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

让我试着给你一些见解!

What happens in case we use TrackingEvent processor, in case that command is successfully executed in Aggregate and that events that Aggregate emits are preserved to DB, but application fails just before Projections are done (that means not saved to DB)?

Axon 中的 TrackingEventProcessor 通过 TrackingToken 跟踪它处理了哪些事件。跟踪处理器将仅在 TrackingToken 所有事件处理组件(例如更新您的预测的组件)被调用后更新。 因此,在那个时间点重新启动时,跟踪处理器将再次处理该事件。这样做时,它会尝试与您的整个事件流保持同步。

In case I use TrackingEvent processor, and app crashes between save and projection - I would have inconsistent state.

这取决于您实施应用程序的方式。听起来一切都非常紧密地耦合在一起,这样做并没有接受你必须处理最终一致性的事实。我知道说起来容易做起来难,但是让您的前端 而不是 期望在您发出命令时立即得到响应最终会简化系统。话又说回来,这在很大程度上取决于你能不能影响UI做事的角度;不确定这是否适合您的情况。

And even if projection is restarted on next boot (as I assume is), client would send same command again (thinking it is failed), but what would happen in aggregate if it receives same command 2nd time?

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

我希望这能让您对 Bojan 有所了解,并毫不犹豫地回答更多问题以掌握 Axon 的这一部分。