gpt4 book ai didi

java - Axon - SubscribingEvent 与 TrackingEvent 处理器

转载 作者:行者123 更新时间:2023-11-30 05:44:57 26 4
gpt4 key购买 nike

我目前正在 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 的这一部分。

关于java - Axon - SubscribingEvent 与 TrackingEvent 处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55020452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com