【问题标题】:Microservice API implementation with two databases具有两个数据库的微服务 API 实现
【发布时间】:2019-07-25 13:18:55
【问题描述】:

我正在构建一个使用 MongoDB 作为“元数据”数据库并使用 S3 进行文件存储的微服务。微服务的 API 之一需要在同一个 API 调用中同时更新 S3 和 MongoDB。

作为一个场景,假设 API 是:

POST /票

  • 使用票证文档更新 S3(即,在一个文件夹中创建了两个文档:用于通过电子邮件发送的 pdf 票证和用于通过电子邮件共享的图像)
  • 使用票状态更新 MongoDB 表,即票已被预订。

我知道订票通常是涉及多个微服务的复杂事务,但对于我们的理论场景,让我们说只有一个微服务就足够了。 Ticket API 运行一些计算并决定通过更新 S3 数据库和 MongoDB 来预订机票。

问题是:我应该如何维护两个数据库之间的内容完整性?

基于一般阅读,对于跨微服务的分布式事务,建议使用 2PC 或类似 SAGA 的一些事件模式。我了解跨微服务的“事务”需要达到复杂程度。但是,如果一个微服务在两个数据库中维护内容,同样的解决方案是否适用?

【问题讨论】:

    标签: transactions microservices


    【解决方案1】:

    只是一个更正,即 2PC 在微服务架构中是非常不鼓励的,因此 SAGA 是首选实践。你可以在这里找到更多SAGA

    当前架构

    一个 API 可以与多个数据源通信。认为数据源只是其他 API,因此单个 API 与多个 API 通信没有问题。

    关于多个数据源中的数据完整性是您的责任。 SAGA 的做法完全相同。分布式服务中的多个本地事务构成完整的事务,如果任何本地事务出现问题,我们会提出补偿事务,指示所有其他服务在它们已经提交本地事务时撤消。这就是我们保持跨服务数据一致的方式。

    在您的情况下,您有责任在 S3 中提交,然后在 mongo DB 中提交,反之亦然。如果有任何问题,您必须恢复或采取普遍措施(补偿事务)以保持两个数据源同步。由于您在单个 API 中执行这两项操作,因此您更容易保持一致性。

    提示:这种架构很好,但可能无法很好地扩展。如果您的业务案例允许,您可以考虑使用队列并触发 lambda 以实现无服务器。将来,如果您使用队列,其他服务也可以使用相同的消息。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2017-04-05
      • 2018-03-30
      • 1970-01-01
      • 2017-07-30
      相关资源
      最近更新 更多