Axon - 多个节点和多个数据库的重复段声明/未声明段

Mat*_*hem 5 java spring axon

我们正在本地运行一个设置,我们在其中启动 Axon 应用程序的两个实例。application.yml 中设置了以下属性:

axon:
  eventhandling:
    processors:
      SomeProcessorName:
        initialSegmentCount: 2
        threadCount: 1
        mode: TRACKING 
Run Code Online (Sandbox Code Playgroud)

所以两个节点都有一个线程,它们应该各自处理一个段。它们都连接到 AxonServer。这两个实例如何协调段声明?

如果我使用内存数据库启动这两个应用程序,我可以在 AxonServer 中看到它们都试图声明段 0,而段 1 两者都没有声明。(我们收到重复声明/无人认领段警告)。如果它们连接到同一个数据库,则不会发生这种情况,实例 1 声明段 0,实例 2 声明段 1。

那么我是否正确地假设相同的处理器必须共享一个数据库才能正常工作?我无法在参考文档中立即找到此信息。

这是否也意味着如果我假设出于性能原因想要复制投影模型(例如:美国的数据库服务器和欧盟的另一个数据库服务器),这将无法正常工作?

澄清一下:我希望两个数据库都构建一个可以单独查询的相同查询模型。就像现在一样(假设我们可以在两个数据库上运行两个节点),节点 1 只会处理段 0 的事件,节点 2 只会处理段 1 的事件。如果我理解正确,这意味着两个数据库都只包含查询模型的一半信息。

因此,为了实现这一点,我必须创建另一个几乎相同的代码库,唯一的区别是处理器名称?

Ste*_*ven 3

我想我可以在这方面提供一些指导。

TrackingEventProcessorAxon 服务器目前不提供跟踪令牌之间的协调。因此,这部分的协调纯粹是在您的应用程序环境中,或者换句话说,与 Axon 服务器客户端的协调。

最务实的方法是TokenStore在两个应用程序之间共享底层存储解决方案;所以你对这部分的假设是正确的。目前的实现TokenStore确实是基于数据库的——但是没有什么能阻止你想出一个分布式解决方案,因为这都是开源的并且可以自由调整。

我不完全遵循你的假设建议:

这是否也意味着,如果我出于性能原因假设想要复制投影模型(例如:美国的数据库服务器和欧盟的另一个数据库服务器),这将无法正常工作?

TrackingEventProcessor嗯,这可以正常工作,但我认为给定的分割TrackingToken不是这部分的方法。该解决方案旨在分担更新单个查询模型的工作负载。顺便说一句,此场景中的“工作负载”是事件流。

如果您希望通过读取事件流来复制给定的查询模型,我确实建议使用第二个TrackingEventProcessor,它下面有一个相同的事件处理组件。请注意,这不应该要求您“复制代码库”。您应该只需要向两个不同的TrackingEventProcessors 注册两个事件处理组件。

如果您使用 Spring Boot 作为配置,那么所有这些通常都会被抽象出来。但如果你看一下EventProcessingConfigurer,你应该能够找到一个公平的 API 描述如何实现这一点。如果该领域的情况不清楚,我建议应该引入一个不同的问题,因为该主题与原始问题有些不同。

希望这足以让您继续@MatthiasVanEeghem!