将整体拆分为微服务数据库问题
Splitting monolith to microservices database issues
我正在将整体应用程序拆分为微服务,并且我能够将其拆分为三个微服务,为了更容易解释,假设它们是:
- 用户(增删改查)
- 消息 (CRUD)
- 其他事情(CRUD)
所有这些都是不同的限界上下文,我将数据库 table 用于微服务。所以在数据库中我有:
USERS table
id
surname
lastname
...
OTHER_THINGS table
id
col1
col2
...
MESSAGES table
id
title
created_time
USER_ID
OTHER_THING_ID
...
现在我的网页需要 searching/filtering 所有这些 table 的所有指定列的消息。例如:
网页用户可以输入:
- USER 的姓氏,
- col2 of OTHER_THINGS
- 消息标题
我应该 return 只过滤行。
对于单体,我使用了简单的数据库 JOINS,但在这种情况下我找不到最佳选择。你能给我一些可能的选择吗?哪些更好?
"suppose I have Orders and Customers tables, where ORDER has FK to CUSTOMER. For me these seems to be in different microservices. "
外键还是不行。 Orders 微服务有一个包含自己的 Customers table 的数据存储。 Customer Update 微服务有一个包含自己的 Customers table 的数据存储。客户订单搜索将是订单微服务的一项功能,因此将搜索其数据存储而不是客户更新数据存储。
微服务的全部意义在于没有依赖性。它们本身就是完整的、离散的系统。这使它们易于构建和部署。障碍是您遇到的问题:数据管理。大多数企业都渴望获得有关其数据的单一事实来源。这通常意味着一个中央数据库,它对应用程序施加了限制,因为一切都必须共享相同的数据模型,并且对公共实体(例如客户)的更改会导致重大动荡。
微服务似乎通过分离出拥有自己的数据模型的功能子集来提供解决方案。这不可避免地意味着整个企业的数据完整性更加松散,因为它是异步处理的。不再有单一的真相来源。
因此,客户更新微服务会将有关客户的更新发布为订单微服务将使用和应用的消息。同样,如果 Orders 微服务可以创建新的 Customers,那么它将发布一个类似的消息流,Customer Update 微服务将使用和应用这些消息流。如果两个微服务在刷新之间的相同 window 中为同一个新客户创建记录,会发生什么情况?好吧,是的,一个好问题。
结果是,微服务在某些情况下可以正常工作,而在其他情况下绝对是灾难性的。当然,大多数企业应用程序将在很大程度上保持单一,这不仅仅是因为惯性,还因为在许多情况下,集中共享数据的好处超过了微服务的敏捷性。
我正在将整体应用程序拆分为微服务,并且我能够将其拆分为三个微服务,为了更容易解释,假设它们是:
- 用户(增删改查)
- 消息 (CRUD)
- 其他事情(CRUD)
所有这些都是不同的限界上下文,我将数据库 table 用于微服务。所以在数据库中我有:
USERS table
id
surname
lastname
...
OTHER_THINGS table
id
col1
col2
...
MESSAGES table
id
title
created_time
USER_ID
OTHER_THING_ID
...
现在我的网页需要 searching/filtering 所有这些 table 的所有指定列的消息。例如:
网页用户可以输入:
- USER 的姓氏,
- col2 of OTHER_THINGS
- 消息标题
我应该 return 只过滤行。
对于单体,我使用了简单的数据库 JOINS,但在这种情况下我找不到最佳选择。你能给我一些可能的选择吗?哪些更好?
"suppose I have Orders and Customers tables, where ORDER has FK to CUSTOMER. For me these seems to be in different microservices. "
外键还是不行。 Orders 微服务有一个包含自己的 Customers table 的数据存储。 Customer Update 微服务有一个包含自己的 Customers table 的数据存储。客户订单搜索将是订单微服务的一项功能,因此将搜索其数据存储而不是客户更新数据存储。
微服务的全部意义在于没有依赖性。它们本身就是完整的、离散的系统。这使它们易于构建和部署。障碍是您遇到的问题:数据管理。大多数企业都渴望获得有关其数据的单一事实来源。这通常意味着一个中央数据库,它对应用程序施加了限制,因为一切都必须共享相同的数据模型,并且对公共实体(例如客户)的更改会导致重大动荡。
微服务似乎通过分离出拥有自己的数据模型的功能子集来提供解决方案。这不可避免地意味着整个企业的数据完整性更加松散,因为它是异步处理的。不再有单一的真相来源。
因此,客户更新微服务会将有关客户的更新发布为订单微服务将使用和应用的消息。同样,如果 Orders 微服务可以创建新的 Customers,那么它将发布一个类似的消息流,Customer Update 微服务将使用和应用这些消息流。如果两个微服务在刷新之间的相同 window 中为同一个新客户创建记录,会发生什么情况?好吧,是的,一个好问题。
结果是,微服务在某些情况下可以正常工作,而在其他情况下绝对是灾难性的。当然,大多数企业应用程序将在很大程度上保持单一,这不仅仅是因为惯性,还因为在许多情况下,集中共享数据的好处超过了微服务的敏捷性。