Axon 事件仅由我的服务的一个实例而不是所有实例扇出接收

问题描述

我们有一个 Spring 微服务连接到 Axon,在这个类上有一个 @Component 和一个 @EventHandler 函数。像这样:

@Component
@AllowReplay(false)
class AClass {
   
    @EventHandler
    fun on(someEvent: SomeEvent) {
    ...some handling here
    }
}

事件被正常接收,一切正常,但是当我们运行多个服务实例时,只有一个服务实例接收事件。我认为这与事件处理器的工作方式(https://docs.axoniq.io/reference-guide/axon-framework/events/event-processors)有关,但我需要服务的所有实例来获取事件。我该如何配置?

解决方法

这在很大程度上取决于您如何配置和使用它。

因此,按照您描述的方式,“拾取”事件,我假设是正在处理的事件。 在这种情况下,这里的另一个假设是您正在使用某种跟踪事件处理器 (TEP),这就是逻辑和责任所在。

本质上,TEP 负责“跟踪”它已经收到的事件,以免对这些事件做出双重反应。 在您的场景中,您的应用/实例似乎共享相同的数据库(因此共享相同的令牌),这就是您看到它的原因。

关于您的“解决方法”,您只是为处理组分配名称(也可以使用如下注释来完成:@ProcessingGroup("processing-group-name-you-want")。如果您不分配名称,则包是使用的默认名称. 每个处理组背后都有一个跟踪令牌。在这种情况下,您会获得多个令牌并对同一事件多次“做出反应”。

有关处理组的更多信息,我推荐this answer

,

对我有用的答案,虽然不是最漂亮的:Axon 根据包名称“合并”处理器,因此服务的多个实例导致单个处理器。

通过使用独特的处理组,您可以诱使 Axon 不将不同的处理器“合并”为一个。

@Autowired
    fun configure(configurer: EventProcessingConfigurer) {
        configurer.assignProcessingGroup { t: String? -> "${t}_${UUID.randomUUID()}" }
    }