具有两个数据库的微服务API实现

时间:2019-07-23 15:10:00

标签: transactions microservices

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

作为一种情况,我们假设API为:

POST /票

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

我了解到,机票预订通常是一项涉及多个微服务的复杂事务,但就我们的理论情况而言,我们只能说一个微服务就足够了。 Ticket API运行一些计算,并决定通过更新S3数据库和MongoDB来预订票证。

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

基于一般阅读,对于跨微服务的分布式事务,建议使用2PC或某些事件模式,例如SAGA。我理解需要跨微服务进行“事务”的复杂性级别。但是,如果单个微服务在两个数据库中维护内容,是否可以使用相同的解决方案?

1 个答案:

答案 0 :(得分:0)

仅在微服务架构中不建议使用2PC,因此SAGA是首选做法。您可以在SAGA

中找到更多信息

当前体系结构

单个API可以与多个数据源通信。认为数据只是其他API的来源,因此单个API与多个API对话不会有问题。

关于多个数据源中的数据完整性是您的责任。 SAGA完全一样。分布式服务中的多个本地事务构成了完整的事务,如果任何本地事务出了问题,我们会提出补偿性事务,指示所有其他服务都已撤消本地事务,则撤消这些事务。这就是我们如何使服务之间的数据保持一致。

在您的情况下,您有责任先提交S3,然后再提交mongo DB,反之亦然。如果有任何问题,您必须还原或采取普遍措施(补偿事务)以使两个数据源保持同步。由于您同时在单个API中进行这两种操作,因此可以更轻松地保持一致性。

提示:此体系结构不错,但可能无法很好地扩展。如果您的业务案例允许,您可以考虑使用队列并触发lambda变为无服务器。将来,如果您使用队列,其他服务也可以使用相同的消息。

希望有帮助!