【问题标题】:Is the a way to skip a failing event in Axon?是在 Axon 中跳过失败事件的一种方法吗?
【发布时间】:2019-11-12 14:23:16
【问题描述】:

我正在尝试实现一种跳过事件的方法,由于遗留数据的不可预见问题,该方法将无休止地重播。当前,失败的事件会阻塞该段,从而停止该段中正在处理的其他事件。我不想删除任何事件,因为我们正试图保持事件存储的不可变性质。

我们正在使用 Axon 3.4,并希望避免升级它。我已经研究了可能的解决方案,并考虑在跟踪事件处理器上使用重置方法来指定它们从下一个事件的跟踪令牌开始处理(允许我们调查故障并在解决时从头开始重播)但是找不到任何方法来确定下一个跟踪令牌是什么。有没有办法在 Axon 中建立这一点,或者可能通过查询我们存储事件的 Postgres 数据库?

【问题讨论】:

  • 为什么要避免迁移到更新的版本?该系统是否已经被视为“遗留”,因此无法进行新的开发?
  • @Steven 我们试图尽量减少代码更改,但似乎没有办法在没有大量新代码的情况下做到这一点
  • Axon 4 主要做了很多导入调整,它替换了构建器模式的构造函数。如果您使用 Axon Spring Boot Starter 而没有自己进行太多配置,那么您应该可以避免大量代码更改。最后,要了解 Axon 3 和 4 之间的 API 更改,请查看此文件:github.com/AxonFramework/AxonFramework/blob/master/…

标签: event-handling cqrs axon


【解决方案1】:

如果您想在所有地方跳过此事件,我能想到的最合理和最简单的解决方案是引入一个Upcaster,它会从事件流中永久过滤掉该事件。 p>

为了实现这一点,我建议创建一个EventUpcaster 实现,因为在这里您会收到IntermediateEventRepresentation 实例中的Stream。在这样的IntermediateEventRepresentation 上,您可以检查它是哪种类型,如果需要,可能会事件内容,并根据需要从流中过滤它。

顺便说一句,无论您使用的是旧版本的 Axon Framework,这都应该可以工作。

【讨论】:

  • 我明白你的意思,但我认为我没有正确解释我的问题。我希望只是暂时跳过该事件,以允许服务继续运行,同时我们对导致事件失败的任何内容进行代码修复,然后使用失败事件重播流。不过谢谢你的建议。使用向上转换可能是唯一的解决方案,但将意味着匆忙进行代码修复以最大程度地减少停机时间
  • 事件处理以什么方式失败?您是否遇到特定类型的异常?如果是这种情况,您始终可以向您的事件处理器提供 ListenerInvocationErrorHandler,它会捕获此确切异常并确保事件处理继续进行而不是暂停。
  • 主要关注我们如何处理生产环境中的新错误。我们如何解决它们,无论是对事件处理程序的更改还是向上转换事件等都不是问题。因为我们正在处理数十年来积累的遗留数据,虽然我们已经进行了大量测试,但我们无法预测所有可能的情况,因此需要一种方法让服务在我们将代码更改为的同时继续生产允许失败的事件在之后处理。感谢您的尝试,但似乎没有任何方法可以解决此问题。
  • 确实很有趣。 ListenerInvocationErrorHandler 的实现会接受一个可以在运行时调整的属性映射吗?此属性映射可能包含“未预见”异常的完全限定类名。这样您就可以继续处理,快速调整以适应意外情况并在以后解决问题。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多