java-Axon-多个节点和多个数据库的重复段声明/未声明段
作者:互联网
我们在本地运行安装程序,在该程序中启动Axon应用程序的两个实例.在application.yml中设置了以下属性:
axon:
eventhandling:
processors:
SomeProcessorName:
initialSegmentCount: 2
threadCount: 1
mode: TRACKING
因此,两个节点都有一个线程,并且每个节点都应处理一个段.它们都连接到AxonServer.这两个实例如何协调段声明?
如果我使用内存数据库启动这两个应用程序,则可以在AxonServer中看到它们都试图声明段0,而两者都没有声明段1. (我们收到重复的声明/未声明细分警告).如果他们连接到同一数据库,则不会发生这种情况,实例1声明段0,实例2声明段1.
我是否假设相同的处理器必须共享数据库才能正常工作,这是否正确?我无法在参考文档中立即找到此信息.
这是否还意味着如果我出于性能考虑假设要复制一个投影模型(例如:美国的数据库服务器和欧盟的另一台数据库服务器),那将无法正常工作?
需要说明的是:我希望两个数据库都构建一个可以分别查询的相同查询模型.就像现在一样(假设我们可以在两个数据库上运行两个节点),节点1将仅处理段0的事件,节点2将仅处理段1的事件.如果我正确理解这一点,则意味着这两个数据库仅包含查询模型信息的一半.
因此,为了实现这一点,我将不得不创建另一个几乎相同的代码库,唯一的区别是处理器名称?
解决方法:
我想我可以在这方面提供一些指导.
此时,Axon Server不提供TrackingEventProcessor的跟踪令牌之间的协调.
因此,这部分的协调完全在您的应用程序环境中,或者与Axon Server客户端不同.
最实用的方法是在两个应用程序之间共享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)不是该部分的方法.
该解决方案旨在分担更新单个查询模型的工作量.
顺便说一句,这种情况下的“工作量”是事件流.
如果您想通过读取事件流来复制给定的查询模型,我确实建议您使用第二个TrackingEventProcessor,其下面具有相同的事件处理组件.
请注意,这不要求您“复制代码库”.
您只需要将两个事件处理组件注册到两个不同的TrackingEventProcessor.
如果您使用Spring Boot作为配置,则通常会将所有这些内容从您那里抽象出来.但是,如果您查看EventProcessingConfigurer,您应该能够找到描述如何实现此目标的公平API.如果该领域的事情还不清楚,我建议您引入一个不同的问题,因为该主题与原始问题有所不同.
希望这足以让您继续@MatthiasVanEeghem!
标签:axon,spring,java 来源: https://codeday.me/bug/20191108/2005791.html