我有一个整体应用程序,当前使用PostgreSQL数据库,并且已按照大多数关系数据库的期望设置了架构,其中各种表数据通过FK链接回用户user_id
。
我试图了解有关微服务的更多信息,并试图将python API迁移到微服务架构。我对如何将较大的应用程序分解为较小的部分有一个合理的了解,但是,我对如何处理事物的数据方面尚不完全清楚。
我知道一个大型数据库违反微服务的一般设计原则,但是我不清楚替代方案是什么。
我最大的担忧是在存储微服务数据的各个数据库之间进行级联。在简单的rdb中,我可以级联删除,数据库将处理各个表的工作。对于微服务,这将如何工作?我是否需要一个单独的服务来处理其他服务数据库中的删除用户数据?
我真的不明白如何将具有关系数据库的传统应用程序迁移到微服务体系结构?
编辑:
需要澄清的是,我面临的特定体系结构/设计问题如下:
我已经将我的应用程序拆分为几个微服务。在我看来仍然具有关联性的是:
地理位置-检查几何数据,在PostGIS中记录并返回某些信息的服务。主要目的是记录特定用户的位置以供以后参考
图像-一种简单的上传服务,用于上传图像并将元数据存储在数据库中。
加载图像-一种简单的服务,可以根据参数(例如位置)和用户个人资料数据(例如年龄,性别等)返回随机的图像集
个人资料-一种仅管理用户数据(例如年龄,性别等)的服务
通常,这三个项目将在更大的数据库中有一个表,而不是各自的数据库。通过说出位置和年龄来过滤图像是一个非常简单的JOIN和过滤器。
这样的事情在微服务架构中如何工作?如果数据完全保存在不同的数据库中,我将如何设置逻辑来过滤数据?我可以复制不经常更改的数据(例如个人资料信息),并将其添加到包含图像数据(包括user_id和个人资料数据)的MongoDB文档中-但是,位置数据可能会定期更改,并且不断进行更新听起来不切实际。
最好的方法是什么?还是我应该只为这几项服务使用共享的RDBMS?
归结为数据的重复,我们为什么要它以及我们如何管理它。
在我们职业生涯的早期,我们就基于冗余的目的(例如数据库复制或备份)在复制上下文中学习了有关复制数据的知识。我们还被教导,可以以关系方式对数据进行建模,而约束条件则强制了模型的完整性。实际上,模型的完整性是神圣不可侵犯的。没有完整性,如何才能保持一致性?答案是你做不到。金田
在使用分布式系统和面向服务时,您这样做是因为要最大程度地减少交互,从而减少组件之间的耦合。但是,这是有代价的。您的架构越分散,其耦合就越少,那么就需要更多的数据重复。对于微服务而言,这是极端的,在微服务中,相同的数据可能以不同的一致性程度出现在许多不同的地方。
但是,在这种情况下,数据复制不是坏问题,而是系统的基本功能。它是具有许多巨大好处的建筑风格的促成因素。换句话说,在没有数据重复的情况下,您将获得更少的分发,更多的耦合,这将使您的系统构建,拥有和更改的成本更高。
因此,现在我们了解了数据重复以及为什么要重复,让我们继续介绍如何管理大量重复数据。让我们尝试一个例子:
假设在关系数据库中,我们有一个名为Customers的表,其中包含一个客户ID和客户详细信息,还有另一个名为Orders的表,其中包含订单ID,客户ID和订单详细信息。假设我们还有一个订购应用程序,如果为GDPR删除了客户,则该应用程序需要删除所有客户的订单。
因为我们正在将系统迁移到微服务,所以我们决定创建一个称为“客户”的服务。
因此,我们通过以下操作创建服务:
我们使用以下操作创建另一个名为Orders的服务:
我们构建了一个用于删除客户的UX屏幕。UX首先调用订单服务以获取客户的所有订单。然后遍历订单列表,调用订单服务以删除订单。然后,它调用客户服务以删除用户。
此示例非常简单,但是如您所见,别无选择,只能从调用者(在本例中为用户界面)协调“删除客户”操作。当然,数据库中的单个原子事务不会转换为多个HTTP / s调用,因此某些调用可能不会成功,从而使整个系统处于不一致状态。在这种情况下,需要通过某种恢复机制解决不一致问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句