使用 Axon Server 在订阅查询的同时处理查询

问题描述

我目前正在将 Axon 框架与 Axon 服务器一起用于我的基于事件的微服务应用程序。最近遇到需要等待saga完全完成并将其执行结果(成功或错误)返回给客户端,我通过在调度命令之前创建订阅查询解决了这个问题触发锁定的 saga,然后等待从 saga 分派的更新并将结果返回给客户端。

现在,这在向客户报告 saga 完成状态方面很有用,但现在我偶然发现了另一个看似相关的问题。每次客户查询我们系统的 API 时,我们都会执行客户帐户的存在检查 - 我们通过在执行任何业务逻辑之前分派相应的查询来做到这一点。在我引入订阅查询之后,当客户端收到关于 saga 完成状态的响应时,他们立即向我们发送查询获取某些实体的更新列表,但是检查帐户是否存在的查询失败并显示 org.axonframework.queryhandling.NoHandlerForQueryException: No handler for query: ...尽管确实有一个为它注册的处理程序,并且它只是在客户端的上一个请求期间处理完全相同的命令,但在发送时由 Axon 服务器返回。在我将内部订阅查询机制添加到等式后,这种情况开始发生。

如果我们稍后重复完全相同的查询或在调用之间延迟几百毫秒,此错误就会消失,但这肯定不是解决方案 - 如果我们的客户端开始同时发送大量请求,会发生什么?发生帐户检查查询?当订阅关闭时,我们是否无法处理某种类型的查询?我在 doFinally 返回的 MonoSubscriptionQueryResult 关闭订阅,但是当下一个查询到达时,它是否有可能在 Axon Server 中实际上没有关闭?或者,我认为更接近事实,我需要以某种方式调整 Axon 服务器的查询处理能力?恕我直言,文档在这主题上相当简洁,尤其是关于查询,而不是事件/命令。

解决方法

从它的声音来看,你遇到了一个错误,@Ivan。我假设您在 Axon Server SE 上?构建一个问题 there 描述手头的问题不会有什么坏处。

据我所知,订阅查询不会影响发送其他查询的能力。因此,一旦订阅查询处于活动状态,查询处理程序不会突然取消注册。或者,绝对不应该。

顺便问一下,您能分享一下您使用的 Axon Framework 和 Axon Server 的版本吗?这有助于推断问题,但也有助于其他可能遇到相同问题的人。