首页 > 解决方案 > Axon 框架的排序策略如何在状态方面起作用

问题描述

在 Axon 的参考指南中写道

除了这些提供的策略之外,您还可以定义自己的策略。所有策略都必须实现 SequencingPolicy 接口。此接口定义了一个方法 getSequenceIdentifierFor,它返回给定事件的序列标识符。返回相同序列标识符的事件必须按顺序处理。可以同时处理产生不同序列标识符的事件。

更重要的是,在这个线程的最后一条消息中,它说

使用排序策略,您可以指示哪些事件需要按顺序处理。线程是在同一个 JVM 中还是在不同的 JVM 中都没有关系。如果排序策略为 2 条消息返回相同的值,则它们将保证按顺序处理,即使您跨多个 JVM 跟踪处理器线程也是如此。

那么这是否意味着事件处理器实际上是无状态的?如果是,那么他们如何设法同步?令牌存储是否用于此目的?

标签: cqrsevent-sourcingaxon

解决方案


我认为这取决于您将什么视为状态,但我假设从您的角度来看,是的,EventProcessorAxon 中的实现确实是无状态的。

当事件发生时,它会从(实现此接口)SubscribingEventProcessor 接收它的事件。自己闲暇时从(实现此接口)检索它的事件。SubscribableMessageSourceEventBusTrackingEventProcessor StreamableMessageSourceEventStore

后一个版本需要跟踪它在事件流上的事件的位置。此信息存储在 中TrackingToken,由 保存TokenStore。一个给定的TrackingEventProcessor线程只有在对它所属的处理组提出声明时才能处理事件。TrackingToken因此,这确保了相同的事件不会被两个不同的线程处理以意外更新相同的查询模型。也允许多线程处理这个TrackingToken过程,这是通过对令牌进行分段来完成的。段数(可通过 调整initialSegmentCount)驱动给定处理组将被分区的片数。TrackingToken的角度来看TokenStore,这意味着您将有几个TrackingToken存储的实例等于您设置的段数。

它的SequencingPolicy工作是驱动流中的哪些事件属于哪个段。这样做,您可以例如使用SequentialPerAggregate SequencingPolicy来确保具有给定聚合标识符的所有事件都由一个段处理。


推荐阅读