不共享数据库的微服务设计
Design of Microservices that do not share a database
我的要求如下:
我们有 2 个微服务。
产品微服务:
订单微服务包含:
现在产品和订单服务驻留在不同的数据库中。
因此,当我尝试检索订单 ID xxx 的订单详细信息时,我还需要产品列表。
如何实现这一点,因为我们不能在这里加入。
在这种情况下,理想的 table 结构应该是什么。
我应该将产品存储为订单模型中的 product_id 列表吗?
在那种情况下,Order table.
的 table 结构(DDL)应该是什么
我明白我们不能进行规范化和创建连接 table 因为 2 个微服务共享不同的数据库。
还有什么是最常见的做法:
- 具有共享数据库的微服务。
- 具有不同数据库的微服务。
谢谢
首先,如果您正在实施微服务架构,您的服务不应该共享数据库,到目前为止还不错。
另一件事是,如果有理由,您可以复制数据。在这种情况下,我会说你愿意。
没有订单行或产品的订单不是完整的订单。可能是产品数据库中的产品更新(例如,相同的 SKU,但颜色从蓝色变为红色)。去年订购的同一产品为蓝色,现在只有红色。这不会改变去年的红色订单。
因此考虑一个“一致性单元”(您可以 google )。没有产品、送货地址、发票地址等的订单是不一致的。您应该将所有这些与订单一起存储,并让订单服务负责订单的所有更新。这就是 DDD 中“限界上下文”的概念。
如果您要求在产品服务中的产品更新时更新某些订单产品属性,则产品服务应向包含更改的订单服务发送消息。然后订单服务根据需要(或不需要)更新其产品。
忘掉微服务架构中的单个数据副本吧。期望拥有最适合每项服务的不同形式的多个副本。这个想法是让每个服务数据存储最终一致。
如果您想认真考虑微服务架构,请阅读领域驱动设计,尤其是限界上下文。 Order 和 Product 很可能不是您域中的限界上下文,可能有比传统的基于实体的数据更好的方式来表达您的系统。
我的要求如下:
我们有 2 个微服务。
产品微服务:
订单微服务包含:
现在产品和订单服务驻留在不同的数据库中。
因此,当我尝试检索订单 ID xxx 的订单详细信息时,我还需要产品列表。 如何实现这一点,因为我们不能在这里加入。 在这种情况下,理想的 table 结构应该是什么。
我应该将产品存储为订单模型中的 product_id 列表吗?
我明白我们不能进行规范化和创建连接 table 因为 2 个微服务共享不同的数据库。
还有什么是最常见的做法:
- 具有共享数据库的微服务。
- 具有不同数据库的微服务。
谢谢
首先,如果您正在实施微服务架构,您的服务不应该共享数据库,到目前为止还不错。
另一件事是,如果有理由,您可以复制数据。在这种情况下,我会说你愿意。
没有订单行或产品的订单不是完整的订单。可能是产品数据库中的产品更新(例如,相同的 SKU,但颜色从蓝色变为红色)。去年订购的同一产品为蓝色,现在只有红色。这不会改变去年的红色订单。
因此考虑一个“一致性单元”(您可以 google )。没有产品、送货地址、发票地址等的订单是不一致的。您应该将所有这些与订单一起存储,并让订单服务负责订单的所有更新。这就是 DDD 中“限界上下文”的概念。
如果您要求在产品服务中的产品更新时更新某些订单产品属性,则产品服务应向包含更改的订单服务发送消息。然后订单服务根据需要(或不需要)更新其产品。
忘掉微服务架构中的单个数据副本吧。期望拥有最适合每项服务的不同形式的多个副本。这个想法是让每个服务数据存储最终一致。
如果您想认真考虑微服务架构,请阅读领域驱动设计,尤其是限界上下文。 Order 和 Product 很可能不是您域中的限界上下文,可能有比传统的基于实体的数据更好的方式来表达您的系统。