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