当前位置: 首页 > 知识库问答 >
问题:

使用Axon Server跨不同JVM将事件分发到订阅事件处理器(没有事件源)

段干华晖
2023-03-14

我使用Axon Framework(4.1),其中一个模块(JVM、容器)中有聚合,另一个模块中有Projections/Sagas。我想做的是让一个分布式应用程序利用CQRS,但没有事件源。

这是相当琐碎的设置和一切工作在一个单一的应用程序预期。当涉及到几个独立的模块(跨独立的JVM)时,问题就出现了。开箱即用的Axon starter使用连接到AxonServerEventStore的跟踪处理器,这允许在监听不同JVM之间的事件时具有“位置透明性”。

在我的情况下,我不想要任何用于持久化或跟踪事件的基础设施。我只想以一种触发-忘记的方式将事件从聚合中分发到任何订阅处理器,就像AxonServerQueryBus分发分散-聚集查询一样。

如果我将所有处理器声明为订阅,如下所示:

    @Autowired
    public void configureEventSubscribers(EventProcessingConfigurer configurer) {
        configurer.usingSubscribingEventProcessors();
    }

事件将到达同一JVM中的所有@eventHandler方法,但事件不再到达其他JVM中的任何处理程序。如果我的理解是正确的,那么,Axon Server将在JVM之间分发事件,仅用于跟踪处理器。

显然,我所能做的是使用外部消息代理(RabbitMQ,Kafka)与SpringamQpMessageSource(如文档中所示)相结合,通过RabbitMQ中的fanout之类的东西将事件分发到所有订阅服务器。这是有效的,但这需要自己维护经纪人。

最好是让Axon服务器来处理这个问题,就像它处理分发命令和查询一样(这样我就可以少关心一个基础结构)。

顺便说一句,我实际上已经设法使用QueryBus将事件分发到投影,并将事件作为有效负载传递到作为分散-聚集查询发送的GenericQueryMessage。不用说,这不是一个稳健的解决方案。但它证明了Axon服务器将事件(毕竟只是另一种类型的消息)无动于衷地分发到SEPs或TEPs并没有什么本质上不可能的。

最后是问题:

2)是否可以让Axon Server跨JVM将事件分发到SEP(不需要外部html" target="_blank">消息代理)?

共有1个答案

伍玮
2023-03-14

关于事件来源的注意事项

从Axon框架的角度来看,事件源是命令模型的唯一关注点。这是采取的立场,因为事件来源定义了通过一个模型已经发布的事件重新创建一个模型。然而,查询模型不会对命令做出反应,发布事件改变了它的状态,它只是侦听(分布式)事件来更新它的状态,以供其他人查询。因此,框架只在重新创建聚合时考虑事件源,方法是提供EventSourcingRepository

事件处理器的工作是“向事件处理程序提供事件的机械方面”。这与CQRS中的Q部分有关,与重新创建查询模型有关。因此,该框架并不将事件处理器视为事件来源概念的一部分。

最后,您将需要定义存储跟踪令牌的基础结构,以便能够分发事件负载,本质上选择完全不使用SubscribingEventProcessor

然而,上述是否是issu取决于您的应用程序。也许您根本没有复制给定的应用程序,因此实际上不会复制给定的跟踪事件处理器。在这种情况下,您可以满足“不跟踪事件”的请求,同时仍然使用跟踪事件处理器。你所要做的就是确保你没有储存它们。用于存储令牌的接口是tokenstore,其中存在内存版本。

然而,在默认的Axon设置中使用InmemoryTokenStore意味着在技术上每次都要重播事件。这是由于默认的“初始跟踪令牌”过程造成的。当然,这也是可配置的,我建议您使用以下方法:

// Creating the configuration for a TEP
TrackingEventProcessorConfiguration tepConfig = 
    TrackingEventProcessorConfiguration
        .forSingleThreadedProcessing() // Note: could also be multi-threaded
        .andInitialTrackingToken(StreamableMessageSource::createHeadToken);

// Registering as default TEP config
EventProcessingConfigurer.
    registerTrackingEventProcessorConfiguration(config -> tepConfig);    

是否可以让Axon Server跨JVM将事件分发到SEP(不需要外部消息代理)?

正如您已经正确指出的,SEPs(目前)只能用于订阅在给定JVM中发布的事件。Axon Server(还)没有一种机制将事件从一个JVM桥接到另一个JVM以允许分布式订阅事件处理。然而,我(作为AxonIQ的一部分)相对肯定,我们将在未来关注这一点。如果这样一个特性对你的项目的成功结束很重要,我建议直接联系AxonIQ。

 类似资料:
  • Node.js应用程序可以使用composer-client.BusinessNetworkConnection.onAPI调用从业务网络订阅事件。事件在业务网络模型文件中定义,并由交易处理函数文件中的指定交易处理。有关发布事件的更多信息,请参阅发布事件。 在你开始之前 在应用程序可以订阅事件之前,你必须定义一些事件和发送它们的交易。还必须部署业务网络,并且必须具有可连接到该业务网络的连接配置文件

  • 目前我们正在使用Axon 2。我们想把Axon 2升级到4。我们使用Axon 2订阅带有重放选项的事件处理器。在Axon 4中,一个显著的区别是跟踪事件处理器。看来,跟踪处理器是重播的必备。有可能拥有订阅和跟踪事件处理器吗?有没有可能把跟踪处理器只用于重放,剩下的就不管了?还是必须改变整个结构?

  • 我正试图开发一个Azure函数来处理由事件中心的捕获功能创建的blob。然而,尽管捕获blobs被正确地存储在容器中,但似乎没有< code>Microsoft。EventHub . capturefile created 事件发布到函数订阅。功能endpoint的事件订阅已创建,没有错误,Azure CLI的输出为 该函数的主体是一个标准的Http触发器,其中包含事件网格endpoint订阅所需

  • 基本上,我试图使用ARM部署一个事件网格订阅来收集订阅中的特定事件(主题类型= Azure订阅)。我已经有一个创建了事件网格触发功能的功能应用程序,只需要将该功能与事件网格订阅绑定为webhook。 我正在使用Azure DevOps中的发布管道来自动化整个工作流。 以下是我使用的一个示例: 这最终部署了事件网格主题,而不是事件网格订阅。 然后,有人建议我尝试以下操作: 但是这最终以这个错误而失败

  • 使用syncing参数订阅同步事件。当节点同步时将返回一个同步对象,否则返回false。 调用: web3.eth.subscribe('syncing' [, callback]); 参数: type:String - "syncing", 订阅类型 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个参数为结果 返回值: EventEmitter: 订阅对象

  • 我正在尝试过滤事件网格中的事件,使其仅在我的订阅中的Azure功能更改时触发(例如配置更改、代码更新或创建/删除新功能)。 我使用的 PowerShell 脚本如下所示: 这将过滤到所有功能和网站(请检查<code>和$AdvancedFilters)。是否有任何方法可以将事件仅过滤到Azure函数?欢迎使用Azure CLI、portal、Powershell或.net sdk中的任何解决方案帮