我刚刚阅读了一篇关于微服务和 PaaS 架构的文章。在那篇文章中,大约下降了三分之一,作者指出(在Denormalize like Crazy下):
重构数据库模式,并对所有内容进行反规范化,以实现数据的完全分离和分区。也就是说,不要使用服务于多个微服务的底层表。不应该共享跨多个微服务的基础表,也不应该共享数据。相反,如果多个服务需要访问相同的数据,则应通过服务 API(例如已发布的 REST 或消息服务接口)共享这些数据。
虽然这在理论上听起来很棒,但在实践中它有一些严重的障碍需要克服。其中最大的原因是,数据库通常是紧密耦合的,每个表都与至少一个其他表有某种外键关系。因此,不可能将数据库划分为由n 个微服务控制的n个子数据库。
所以我问:给定一个完全由相关表组成的数据库,如何将其反规范化为更小的片段(表组),以便这些片段可以由单独的微服务控制?
例如,给定以下(相当小但示例性的)数据库:
[users] table
=============
user_id
user_first_name
user_last_name
user_email
[products] table
================
product_id
product_name
product_description
product_unit_price
[orders] table
==============
order_id
order_datetime
user_id
[products_x_orders] table (for line items in the order)
=======================================================
products_x_orders_id
product_id
order_id
quantity_ordered
不要花太多时间批评我的设计,我是即时完成的。关键是,对我来说,将这个数据库分成 3 个微服务是合乎逻辑的:
UserService
- 用于系统中的 CRUDding 用户;应该最终管理[users]
表;和ProductService
- 用于系统中的 CRUDding 产品;应该最终管理[products]
表;和OrderService
- 用于系统中的 CRUDding 订单;应该最终管理[orders]
和[products_x_orders]
表
然而,所有这些表都具有彼此之间的外键关系。如果我们对它们进行非规范化并将它们视为单体,它们就会失去所有的语义意义:
[users] table
=============
user_id
user_first_name
user_last_name
user_email
[products] table
================
product_id
product_name
product_description
product_unit_price
[orders] table
==============
order_id
order_datetime
[products_x_orders] table (for line items in the order)
=======================================================
products_x_orders_id
quantity_ordered
现在没有办法知道谁订购了什么、数量多少或何时订购。
那么这篇文章是典型的学术喧嚣,还是这种非规范化方法在现实世界中具有实用性,如果是这样,它是什么样的(在答案中使用我的示例的奖励积分)?