Axon - 多个节点和多个数据库的重复段 claim/unclaimed 段

Axon - Duplicate segment claim/unclaimed segments for multiple nodes and multiple databases

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

axon:
  eventhandling:
    processors:
      SomeProcessorName:
        initialSegmentCount: 2
        threadCount: 1
        mode: TRACKING 

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

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

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

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

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

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

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

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

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

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

Does this then also mean that if I would hypothetically want to replicate a projection model for performance reasons (e.g: database server in the US and another one in the EU), this would not work properly?

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

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

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

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