微服务中的关系型数据库

mae*_*416 6 postgresql relational-database microservices

我有一个整体应用程序,当前使用 PostgreSQL 数据库,并且模式的设置与您对大多数关系数据库的期望相同,其中各种表数据通过user_id.

我正在尝试了解有关微服务的更多信息,正在尝试将我的 python API 迁移到微服务架构。我对如何将较大的应用程序分解为较小的部分有一个合​​理的理解,但是,我并不完全清楚应该如何处理事物的数据方面。

我知道单个大型数据库违反了微服务的一般设计原则,但我不清楚替代方案是什么。

我最关心的是跨保存微服务数据的各个数据库的级联。在一个简单的 RDB 中,我可以级联删除,数据库将处理各个表的工作。就微服务而言,它是如何工作的?我是否需要一个单独的服务来处理跨其他服务数据库删除用户数据?

我真的不明白如何将具有关系数据库的传统应用程序迁移到微服务架构?

编辑:

澄清一下 - 我面临的具体架构/设计问题如下:

我已将我的应用程序分成几个微服务。在我看来仍然相关的是:

地理定位 - 检查几何数据、PostGIS 中的记录并返回某些信息的服务。主要目的是记录特定用户的位置以供以后参考

图像 - 一个简单的上传服务,用于上传图像并将元数据存储在数据库中。

Load-Image - 一项简单的服务,根据位置等参数以及年龄、性别等用户配置文件数据返回一组随机图像

个人资料 - 简单管理用户数据(例如年龄、性别等)的服务

通常,这三个项目在更大的数据库中各有一个表,而不是它们自己的单独数据库。按位置和年龄过滤图像是一个非常简单的连接和过滤器。

类似的东西在微服务架构中如何工作?如果数据完全保存在不同的数据库中,我将如何设置逻辑来过滤数据?我可以复制不经常更改的数据(例如个人资料信息),并将其添加到包含图像数据(包括 user_id 和个人资料数据)的 MongoDB 文档 - 然而,位置数据可以定期更改,持续更新听起来并不实用。

最好的方法是什么?或者我应该只为这少数服务使用共享 RDBMS?

tom*_*ern 8

这归结于数据的重复、我们为什么需要它以及我们如何管理它。

在我们职业生涯的早期,我们被教导有关数据复制以使其冗余,例如在数据库复制或备份中。我们还了解到,可以通过关系方式对数据进行建模,并通过约束来强制模型的完整性。事实上,模型的完整性是神圣不可侵犯的。没有诚信,怎么能有一致性呢?答案是你不能。有点。

当您使用分布式系统和面向服务时,您这样做是因为您希望最大限度地减少交互,从而减少组件之间的耦合。然而,这是有代价的。您的架构越分散,其耦合度就越低,并且需要的数据重复就越多。微服务将这种情况发挥到了极致,实际上相同的数据可能以不同程度的一致性存在于许多不同的地方。

然而,在这种情况下,数据重复并不是坏事,而是系统的一个基本功能。它是一种架构风格的推动者,具有许多巨大的好处。换句话说,如果没有重复的数据,您将获得更少的分布,获得更多的耦合,这使得您的系统的构建、拥有和更改成本更高。

现在我们了解了数据的重复以及我们为什么需要它,让我们继续讨论如何管理大量重复。让我们尝试一个例子:

在关系数据库中,假设我们有一个名为 Customers 的表,其中包含客户 ID 和客户详细信息,以及另一个名为 Orders 的表,其中包含订单 ID、客户 ID 和订单详细信息。假设我们还有一个订购应用程序,如果因 GDPR 删除客户,则需要删除该客户的所有订单。

因为我们正在将系统迁移到微服务,所以我们决定创建一个名为“客户”的服务。

因此我们创建一个服务,操作如下:

  • DELETE /customers/{customerId} - 删除客户

我们创建另一个名为 Orders 的服务,具有以下操作:

  • GET /orders/customers/{customerId} - 获取客户的所有订单
  • DELETE /orders/{orderId} - 删除订单

我们构建了一个用于删除客户的用户体验屏幕。用户体验首先调用订单服务来获取客户的所有订单。然后它迭代订单列表,调用订单服务来删除订单。然后调用客服删除该用户。

这个示例非常简单,但正如您所看到的,除了从调用者(在本例中是用户界面)协调“删除客户”操作之外别无选择。当然,数据库中的单个原子事务不会转换为多个 HTTP/s 调用,因此某些调用可能不会成功,从而使整个系统处于不一致的状态。在这种情况下,需要通过某种恢复机制来解决不一致问题。

  • @maestro416 我不确定我是否同意用户界面负责协调跨上下文的数据一致性。这是非常脆弱的并且不是很有效。您通常会通过消息传递基础设施集成上下文,从而实现可靠的最终一致性模式。例如,客户上下文调度 CustomerDeactivated 事件/消息,订单上下文拾取该事件/消息并依次归档订单。 (2认同)