首页 > 解决方案 > Axon 框架:仅处理由同一 JVM 实例发布的事件?

问题描述

嗨 Axon 框架社区,

我想就如何正确解决以下问题征求您的意见。

我的轴突测试设置

我想要达到的目标

我希望一个实例发布的事件仅由同一个实例处理

如果 instance1 发布 eventX,那么只有 instance1 应该处理 eventX

到目前为止我尝试过的

class StackEventInterceptor(private val stackProperties: StackProperties) : MessageHandlerInterceptor<EventMessage<*>> {

    override fun handle(unitOfWork: UnitOfWork<out EventMessage<*>>?, interceptorChain: InterceptorChain?): Any? {
        val stackId = (unitOfWork?.message?.payload as SomeEvent).stackId
        if(stackId == stackProperties.id){
            interceptorChain?.proceed()
        }
        return null
    }
}
@Configuration
class AxonConfiguration {

    @Autowired
    fun configure(eventProcessingConfigurer: EventProcessingConfigurer, stackProperties: StackProperties) {
        val processingGroup = "processing-group-stack-${stackProperties.id}"
        eventProcessingConfigurer.byDefaultAssignTo(processingGroup)
        eventProcessingConfigurer.registerHandlerInterceptor(processingGroup) { StackEventInterceptor(stackProperties) }
    }
}

有更好的解决方案吗?

我的印象是我当前的解决方案并不是最好的,因为理想情况下,我希望只有属于某个实例的事件处理程序由 TrackingEventProcessor 实例触发。

你会怎么解决?

标签: cqrsaxon

解决方案


您在这里遇到的有趣场景@thowimmer。我的第一个预感是说“SubscribingEventProcessor改用”。但是,您指出这不是您的设置中的一个选项。我认为对于处于相同情况的其他人来说,知道为什么这不是一种选择是非常有价值的。所以,也许你可以详细说明一下(说实话,我也很好奇)。

现在为您的问题案例确保事件仅在同一个 JVM 中处理。将来源添加到事件中绝对是您可以采取的一个步骤,因为这允许以逻辑方式进行过滤。“这个事件起源于my.origin()?” 如果没有,您只需忽略该事件并完成它,就这么简单。不过,还有另一种方法可以实现这一点,我稍后会谈到。

但是,我认为过滤的地方主要是您要寻找的地方。但首先,我想先说明 为什么需要过滤。正如您所注意到的,TrackingEventProcessor(TEP)从所谓的StreamableMessageSource. 这EventStore是一个这样的实现StreamableMessageSource。当您将所有事件存储在同一个存储中时,它只会将所有内容流式传输到您的 TEP。由于您的事件是单个事件流的一部分,因此您需要在某个阶段过滤它们。使用 aMessageHandlerInterceptor可以工作,您甚至可以编写 aHandlerEnhacnerDefinition允许您向事件处理函数添加额外的行为。但是,尽管您这么说,但在当前设置下,需要在某处进行过滤。可以说是最MessageHandlerInterceptor简单的地方。

但是,有一种不同的方法来处理这个问题。为什么不将您的 Event Store 分离为两个应用程序的不同实例?显然他们不需要互相读取,那么为什么要共享同一个事件存储呢?在不了解您的领域的进一步背景的情况下,我猜您本质上是在处理驻留在不同有界上下文中的应用程序。简而言之,与应用程序/上下文共享所有内容的兴趣为零,您只需非常有意识地彼此共享您的领域语言的特定部分。

请注意,支持多个上下文,在中间使用单个通信集线器,这正是Axon Server 可以为您实现的。我不是在这里说你不能自己配置这个,我过去做过。但是将这项工作留给某人或其他人,让您无需配置基础设施,这将节省大量时间。

希望这可以帮助您设置我对此事@thowimmer 的一些想法。


推荐阅读