【问题标题】:Design of Microservices that do not share a database [closed]不共享数据库的微服务设计[关闭]
【发布时间】:2021-10-19 20:49:05
【问题描述】:

我的要求如下:

我们有 2 个微服务。

产品微服务:

订单微服务包含:

现在产品和订单服务位于不同的数据库中。

因此,当我尝试检索订单 id xxx 的订单详细信息时,我还需要产品列表。 如何实现这一点,因为我们不能在这里加入。 在这种情况下,理想的表结构应该是什么。

我应该将产品作为 product_id 列表存储在 Order 模型中吗? 在那种情况下,订单表的表结构(DDL)应该是什么。

我知道这里我们不能进行规范化并创建连接表,因为 2 个微服务共享不同的数据库。

还有什么是最常见的方法:

  1. 具有共享数据库的微服务。
  2. 具有不同数据库的微服务。

谢谢

【问题讨论】:

    标签: microservices


    【解决方案1】:

    首先,如果您正在实施微服务架构,那么您的服务不应该共享数据库,到目前为止一切都很好。

    要意识到的另一件事是,如果您有理由,您可以复制数据。在这种情况下,我会说你愿意。

    没有订单行或产品的订单不是完整的订单。可能是产品数据库中的产品更新(例如,相同的 SKU 但颜色从蓝色变为红色)。去年订购的蓝色相同产品,现在只提供红色。这并没有改变去年的红色订单。

    所以考虑一个“一致性单位”(你可以用谷歌搜索)。如果没有产品、交货地址、发票地址等,订单就会不一致。您应该将所有这些与订单一起存储,并让订单服务负责订单的所有更新。这就是 DDD 中“有界上下文”的思想。

    如果您需要在产品服务中的产品更新时更新某些订单产品属性,则产品服务应向订单服务发送包含更改的消息。然后,订单服务会根据需要(或不需要)更新其产品。

    在微服务架构中忘记数据的单个副本。期望以最适合每项服务的不同形式拥有多个副本。这个想法是使每个服务数据存储最终保持一致。

    如果您想认真考虑微服务架构,请阅读领域驱动设计,尤其是限界上下文。很可能 Order 和 Product 不是您的域中的有界上下文,可能有比传统的基于实体的数据更好的方法来表达您的系统。

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2019-12-06
      • 1970-01-01
      • 2017-09-11
      • 2017-09-22
      • 2017-06-15
      • 2016-12-13
      相关资源
      最近更新 更多