Axoniq 事件处理程序从偏移量恢复

Axoniq Event Handler Resuming from offset

我正在查看 AxonIQ 框架并已成功启动测试应用程序 运行。但是我有一个问题,关于在使用在读取模型中具有持久性的存储时应该如何处理 EventHandlers。

来自我(可能是幼稚的)理解。我的 Projection class 中的 @EventHandler 注释方法在首次启动时从头开始调用。这种机制似乎假设 Projection 使用某种易失性存储(例如内存中的 sql,如 h2),它在应用程序启动期间从头开始重新创建。

但是,如果存储在诸如 Elastic Search 之类的东西中持久存在,我希望 @EventHandler 从它的最后一个持久事件而不是从开始事件恢复。

有没有办法以这种方式控制@EventHandler 的行为?

Axon 有两种类型的事件处理器:订阅和跟踪。

订阅模式(这是 Axon 3 的默认模式)将在传递事件的线程中处理事件。这意味着您处于 "the mercy" 交付事件的组件的交付保证。

跟踪模式(这是自 Axon 4 以来使用事件存储或支持它的源时的默认设置)将在专用线程中处理事件,由事件处理器本身管理。这意味着事件是从实际发布机制异步处理的。

跟踪事件处理器使用令牌来跟踪进度。这些令牌存储在 TokenStore 中,并在处理器正确处理每个传入事件(可能是批处理的)时更新。您决定这些令牌的存储位置。如果您更新关系数据库,我们建议将令牌存储在同一个数据库中,以便事件更改和令牌自动更新。

如果您未指定任何 TokenStore,这取决于您是否处于 Spring 启动状态,在这种情况下,Axon 将尝试为您检测合适的 TokenStore 实现。否则,它很可能只是一个内存中的 TokenStore,这会导致处理器在每次启动时重新初始化(并且可能从头开始)。

配置 TokenStore

  • 在 Spring(引导)上,只需添加一个 TokenStore 类型的 bean 以及您要使用的实现
  • 使用 Axon 的配置 API 时,在 EventProcessingConfigurer 上,使用 registerTokenStore(...) 方法之一。

当跟踪处理器启动时,它会检查令牌存储的先前进度,并自动从那里继续。