【问题标题】:How to design a microservice based application with each microservice having their own datasource?如何设计一个基于微服务的应用程序,每个微服务都有自己的数据源?
【发布时间】:2018-07-12 13:14:11
【问题描述】:

我正在设计一个基于微服务的应用程序,其中有一些服务使用来自 MySQL 数据库的信息。有两种服务 - 预订服务和支付服务。

Payment Service 需要 Booking Service 提供的信息。

如何使用 MySQL 进行设计,同时为两个服务保留单独的数据库?如何在不同数据库上的两个表之间强制执行关系约束?

P.S:我正在使用 Spring Boot 来设计 Web 服务。

【问题讨论】:

  • 您不能在两个独立的数据库之间强制实施关系约束 - 如果您认为需要,您的两个服务耦合太紧密,无法成为单独的微服务。
  • 所以预订付款发票必须将所有这些单独的服务合并为一项服务?

标签: java spring-boot microservices rdbms


【解决方案1】:

在微服务中没有所谓的关系一致性,您的系统应该最终保持一致。

让我们来看看你的情况,你有两个不同的微服务。数据库

  • 预订
  • 付款

现在假设有人创建了预订,现在想使用支付服务为预订付款。

您一定认为这是付款服务,我应该检查预订是否存在或预订是否取消。

如果不在服务之间创建非常高级别的依赖关系,则可以实现上述验证,但不是 100%,这违反了微服务的原则。

我举个例子:

  1. 有人在付款过程中取消了预订 - 假设您在通过 Booking Service 确认预订正常后在 Payment Service 中处理付款,而在付款过程中有人取消了预订

现在在这种情况下,系统暂时处于不一致状态,您应该从 Booking Service 上的事件(如 BookingCancelled)检查我们是否已付款,是的,然后开始付款反向过程,而不是检查所有事情一次。

寻求最终一致的系统,其中两个服务都监听 事件相互关联,并试图保持一致。

【讨论】:

    【解决方案2】:

    建议微服务使用不同的数据库并维护自己的数据(PolyglotPersistence)。

    API 之间的数据共享应该通过 API 进行。

    在这种情况下,如果支付服务需要预订详细信息,则应通过调用预订服务 API 来检索详细信息。

    有关更多详细信息,请参阅 Martin Fowler 撰写的 link 微服务文章。

    【讨论】:

    • 我认为支付服务不应该调用预订服务 API。支付服务甚至不应该关心也不知道预订服务甚至存在!相反,支付服务应该只监听事件以更新其数据存储,以便最终与所需内容保持一致。请参阅解决此问题的 techagrammer 的答案。
    猜你喜欢
    • 2019-12-16
    • 2016-01-28
    • 2018-06-09
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多