Spring boot 与axon连接的微服务是否应该共享axon框架相关的表?

Spring boot 与axon连接的微服务是否应该共享axon框架相关的表?,spring-boot,jpa,axon,Spring Boot,Jpa,Axon,我正在启动一个项目,希望有多个服务可以使用axon服务器相互通信 我有多个具有以下堆栈的服务: SpringBoot2.3.0.RELEASE(带启动器:数据、JPA、web、mysql) 轴突 弹簧防尘套启动器-4.2.1 每个服务在mysql服务器中使用不同的模式 当我在激活axon框架的情况下启动spring引导服务时,会在每个应用程序的数据库模式中创建一些令牌表、SAGA表等 我有两个问题 在我试图构建的体系结构中,我应该只有 一个数据库,用于所有“启用轴突”的服务,因此sagas,

我正在启动一个项目,希望有多个服务可以使用axon服务器相互通信

我有多个具有以下堆栈的服务:

  • SpringBoot2.3.0.RELEASE(带启动器:数据、JPA、web、mysql)
  • 轴突 弹簧防尘套启动器-4.2.1
每个服务在mysql服务器中使用不同的模式

当我在激活axon框架的情况下启动spring引导服务时,会在每个应用程序的数据库模式中创建一些令牌表、SAGA表等

我有两个问题

  • 在我试图构建的体系结构中,我应该只有 一个数据库,用于所有“启用轴突”的服务,因此sagas, 代币、事件等只在一个地方

  • 如果是的话,有人能告诉我吗 提供如何配置自定义配置的示例 EntityManagerProvider将服务的数据库分离 从轴突数据库


  • 我假设您的每个微服务都是一个子域的模型。由于事件确实对(子)域以及聚合、实体和值对象进行建模,因此我非常赞成将与轴突相关的模式与每个服务对应的数据库/模式分开。因此,在考虑此类技术选项时,我更倾向于采用建模优先的方法

    这就是我们目前在微服务生态系统中所做的


    对于Axon资产和特定于应用程序的资产,使用相同的模式(即每个子域一个)至少还有一个技术原因。我的同事向我指出了这一点。如果您(将)使用事件源(从而通过获取并应用处理命令后产生的所有过去的事件来重建聚合的状态),那么您很可能需要包含此获取的事务以及可能(通过事件)触发的命令处理代码写入特定于微服务的数据库。

    Axon可能需要五个表,当然这取决于您对Axon的使用情况。 这些是:

  • 事件表
  • 快照事件表
  • 令牌表
  • 佐贺表
  • 关联值条目表
  • 使用时,不会创建表1和表2,因为Axon Server是事件和快照的存储解决方案。 当不使用Axon服务器时,我确实建议为这些设置一个专用的数据源

    表3服务于
    令牌库
    ,应该尽可能接近您的查询模型。标记描述了给定的
    EventProcessor
    处理事件的能力。由于这些
    EventProcessors
    通常为创建查询模型的投影仪提供服务,因此从事务角度来看,将它们放在一起是明智的


    表4和表5都是佐贺曲所必需的。“Saga表”存储序列化的Saga,而“关联值条目表”携带事件和Saga之间的关联值,以便框架可以加载正确的Saga。我会将这些数据存储在一个专用数据库中,或者与给定(微)服务的其他表一起。

    感谢您的回答@Octavian Theodor,然后为了做到这一点,我仍然需要在每个微服务上创建两个数据源,一个用于微服务模式,一个用于axon表,这是我问题的第二部分,您是否在设置中使用自定义EntityManager Provider?你能提供一个如何使用它的例子吗?事实上,我们目前正在将轴突相关的表存储在存储其余表的同一个模式中,等等。这不是我设置的,但我们还没有遇到任何问题:)考虑到事件确实对你的域建模,根据这里的答案--,聚合的状态不一定按原样维护,但作为一系列事件,至少事件应该与其他域建模内容一起存储也是有意义的。尽管@Steven可能会有更明智的意见……将这两个表单独保存在ds中的附加值是什么?在我看来,这些事件也为这个领域建模,对吗?此外,我可能会大错特错,但在重放这些事件(我指的是源代码聚合)以执行一些验证/逻辑以及稍后的更新和存储时,我们可能希望所有这些事件都在同一事务中,对吗?我假设“这两个表”指的是“事件和快照事件表”。将其视为命令模型(即使用事件源时的事件和快照)之间的隔离。您不希望妨碍选择事件数据库来对查询模型的存储内容施加约束。这些关注点需要隔离,以便您可以选择为这些查询模型设置的最佳数据库。此外,事件/快照数据库也可以作为分发事件存储的一种手段。对查询模型数据库执行同样的操作可能并不总是您想要的。因此,我们又有了一个理由将它们分开,以实现这种灵活性。啊,我现在明白了你的目标,感谢你的澄清:)事实上,在我看来,我指的只是所谓的写(或命令)模型,而不是查询模型。特别是在我们的应用程序中,查询模型是一个Elasticsearch索引,而不是RDB,因此它们是“自然”分开的……啊,没错,用于读取聚合事件流的事务与用于处理命令和存储(如果有)后续事件的事务是相同的。