Cqrs 轴突:@StartSaga不';从订阅模式切换到跟踪模式时无法调用

Cqrs 轴突:@StartSaga不';从订阅模式切换到跟踪模式时无法调用,cqrs,axon,saga,Cqrs,Axon,Saga,标题概括了问题的症结所在。每当我们运行性能测试时,如果我们打算通过消耗的事件(反馈给@StartSaga)启动10个saga实例,我们就能够在使用订阅模式时成功完成这些实例,但是当我们切换模式时,只会创建前一个或两个实例,然后停止处理。我们知道日志拦截器证明了事件正在被消耗,但是saga事件处理程序没有被调用。除了改变模式外,还有关于YAML配置改变的建议吗?通过调试,我们发现由于AbstractSagaManager.shouldCreateSaga()返回false,导致segment.ma

标题概括了问题的症结所在。每当我们运行性能测试时,如果我们打算通过消耗的事件(反馈给@StartSaga)启动10个saga实例,我们就能够在使用订阅模式时成功完成这些实例,但是当我们切换模式时,只会创建前一个或两个实例,然后停止处理。我们知道日志拦截器证明了事件正在被消耗,但是saga事件处理程序没有被调用。除了改变模式外,还有关于YAML配置改变的建议吗?通过调试,我们发现由于
AbstractSagaManager.shouldCreateSaga()
返回false,导致
segment.matches(initializationPolicy.getInitialAssociationValue())
返回false,因此没有创建实例。理想情况下,只需切换处理模式,不应返回不同的结果,不是吗

编辑(4/23/21):

我目前正在使用跟踪模式对JPA/Oracle进行测试,段数为4,线程数为2,并且只有一个应用程序实例具有saga和聚合。
StreamableKafkaMessageSource
是TEP中的消息源。JpaTokenStore或TEP没有任何定制。Bean的定义如下:

@Bean
@ConditionalOnMissingBean
public StreamableKafkaMessageSource<byte[], byte[]> kafkaMessageSource(
        ConsumerFactory<byte[], byte[]> kafkaConsumerFactory,
        Fetcher<byte[], byte[], KafkaEventMessage> kafkaFetcher,
        KafkaMessageConverter<byte[], byte[]> kafkaMessageConverter
) {
    return StreamableKafkaMessageSource.<byte[], byte[]>builder()
            .topics(getTopics())
            .groupIdPrefix(eventHandlingProperties.getConsumer().getGroupId())
            .groupIdSuffixFactory(() -> "")
            .consumerFactory(kafkaConsumerFactory)
            .fetcher(kafkaFetcher)
            .messageConverter(kafkaMessageConverter)
            .bufferFactory(() -> new SortedKafkaMessageBuffer<>(properties.getFetcher().getBufferSize()))
            .build();
}
@Bean
@条件性缺豆
公共可流式kafkaMessageSource kafkaMessageSource(
卡夫卡消费工厂,
费彻·卡夫卡菲彻,
卡夫卡消息转换器卡夫卡消息转换器
) {
返回StreamableKafkaMessageSource.builder()
.topics(getTopics())
.groupIdPrefix(eventHandlingProperties.getConsumer().getGroupId())
.groupIdSuffixFactory(()->“”)
.消费者工厂(卡夫卡消费者工厂)
.fetcher(卡夫卡菲彻)
.messageConverter(kafkaMessageConverter)
.bufferFactory(()->新SortedKafkaMessageBuffer(properties.getFetcher().getBufferSize()))
.build();
}
关于
shouldCreateSaga
失败有什么建议吗?在
Segment.matches(value)
中,我有
segmentId=0
mask=3
,以及
AssociationValue=2be6c707-c5fc-4654-b513-bcede37ed9a4
,此调用失败

如果我删除
token\u条目
表,使saga管理器再次运行之前完成的整个saga集(分区偏移量返回到0),saga将成功完成,但在完成之后,我尝试启动另一个saga,它将失败

段中。匹配(int值)
(掩码和值)==1)
,而我的
段ID==0
。这告诉我什么?为什么Axon将AssociationId与segments进行比较

编辑(4/25/21):

在使用订阅模式时,我将向我的
orderagragregate
发送
命令,然后发布一个
orderacreated
事件,由
@StartSaga
处理程序处理,一切正常。传奇故事如预期的那样立即完成。但在跟踪模式下,有时会创建传奇,而在其他时间,我看到的只是发布
OrderCreated
的聚合,其他什么都不会发生。奇怪的是,如果我再开始一些传奇故事,我会看到那些过去从未开始的传奇故事最终在
AbstractSagaManager
中得到处理。在某些情况下,
startNewSaga()
会被调用,而在其他情况下则不会被调用,但每个命令都带有一个随机UUID作为其
关联值。我是否应该期待一个传奇故事在创作完成后立即完成

编辑(4/26/21):


进步!事实证明,在MemoryEventsStorage Engine中使用
或与JPA一起使用H2数据库解决了这个问题。话虽如此,使用Oracle是否存在任何已知问题?

这确实不会造成结果上的巨大差异。Saga及其事件处理器是否有其他配置?还有,是什么类型的消息源为is事件处理器提供事件?@Steven:有关更新,请参阅EditsHanks。我开始怀疑这部传奇是否是通过所需的消息流开始的。当在传奇中使用订阅时,Axon的EventBus很可能只是用来代替Kafka消息源。InMem存储引擎更新与传奇追踪相结合,强化了这一理念,因为默认的可流化源是事件存储。您介意指定如何为您的传奇配置消息源吗?@Steven:在我们的YAML中,我们定义了
axon.eventhandling.processors..source=kafkaMessageSource
,其中
kafkaMessageSource
是一个
StreamableKafkaMessageSource
。我们使用的是基于Avro的自定义消息转换器。我假设
字段在本例中等于
[您的saga类名]处理器
?这是Axon对Saga处理器的默认命名方案。顺便说一句,您可以通过将
@ProcessingGroup
注释添加到传奇中来覆盖这一点。