【问题标题】:Should microservices connected with axon share the axon framework related tables?与 axon 连接的微服务是否应该共享 axon 框架相关的表?
【发布时间】:2020-06-25 19:24:38
【问题描述】:

我正在开始一个项目,我希望有多个使用轴突服务器相互通信的服务。

我有不止一项服务具有以下堆栈:

  • Spring Boot 2.3.0.RELEASE(带启动器:Data、JPA、web、mysql)
  • 轴突 Spring Boot Starter - 4.2.1

每一项服务在 mysql 服务器中使用不同的架构。

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

我有两个问题

  1. 在我正在尝试构建的架构中,我应该只有 一个用于所有“启用轴突”服务的数据库,所以 sagas, 令牌、事件等只在一个地方?

  2. 如果是这样,任何人都可以 提供如何配置自定义的示例 EntityManagerProvider 将服务的数据库分开 来自Axon的数据库?

【问题讨论】:

    标签: spring-boot jpa axon


    【解决方案1】:

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

    1. 事件表。
    2. 快照事件表。
    3. 令牌表。
    4. Saga 表。
    5. 关联值条目表。

    使用Axon Server 时,将创建表 1 和 2,因为 Axon Server 是事件和快照的存储解决方案。 当不使用 Axon Server 时,我确实建议为这些设置一个专用数据源。

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

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

    【讨论】:

    • 将(仅)这两个表保存在单独的 ds 中的附加值是什么?在我看来,事件也是领域的模型,对吧?另外,我可能大错特错了,但是,当重放这些事件(我说的是源聚合)以执行一些验证/逻辑以及稍后更新和存储时,我们可能希望所有这些事件都在同一个事务中,对吧?
    • 我假设“这两个表”您正在谈论“事件和快照事件表”。将其视为命令模型之间的隔离,命令模型是您使用事件溯源时的事件和快照。您不希望阻止事件数据库的选择来限制查询模型的存储内容。这些问题需要隔离,以便您可以选择为这些查询模型设置的最佳数据库。
    • 添加,事件/快照数据库也可以作为分发事件存储的一种手段。对您的查询模型数据库执行相同操作可能并不总是您想要的。因此,再次有理由将它们分开以实现这种灵活性。
    • 啊,我现在看到你的目标了,谢谢你的澄清:)确实,在我看来,我只是指所谓的写(或命令)模型,从不查询一个。特别是因为在我们的应用程序中,查询模型是 Elasticsearch 索引而不是 RDB,因此它们是“自然”分离的......
    • 啊,是的,用于读取聚合事件流的事务与用于处理命令和存储(如果有)后续事件的事务相同。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复@Octavian Theodor,为了做到这一点,我仍然需要在每个微服务上创建两个数据源,一个用于微服务模式,一个用于轴突表,这是第二个我的问题的一部分,您是否在设置中使用自定义 EntityManagerProvider ?你能提供一个如何使用它的例子吗?
    • 实际上,我们目前将与 Axon 相关的表存储在与存储其余表等相同的架构中。不是我设置的,但我们没有遇到任何问题,到目前为止:)
    • 考虑到一个事件确实为您的域建模,并且根据此处的答案 -- stackoverflow.com/questions/54933692/…,聚合的状态不一定保持原样,而是作为一系列事件,至少事件应该与其他领域建模事物一起存储也是有道理的。虽然@Steven 可能有更明智的意见......
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-03-30
    • 2019-04-24
    • 2021-10-21
    • 1970-01-01
    • 2020-01-20
    • 2019-07-30
    相关资源
    最近更新 更多