Pony ORM 和微服务架构
Pony ORM and a micro-service architecture
我们有一个使用 Flask/Pony 框架构建的单体应用程序。现在效果很好。
但是,在不久的将来,我们将开始转向微服务架构。在此过程中,我们很可能会为每个服务创建一个单独的 Db。由于一些我不会深入的原因,这是有益的。但是我挂断了电话,我知道很多其他人也在考虑目前表之间发展的外键关系时。
人们通过非规范化他们的数据库解决了这个问题,最终在另一个服务的数据库中出现了重复的表。
我很好奇 Pony 的用户如何看待这个解决方案以及它是否可行。
其他使用 PonyORM 或任何其他 ORM 的人在使用微服务架构时有什么想法?
编辑:
我们现在的数据库很简单:
Main DB
User
|-id
|-name
|-role = Required("Role")
Role
|-id
|-name
|-set("User")
现在这一切都在一个 Db 中,但逻辑在两个不同的服务中。用户服务和角色服务。角色服务控制允许用户访问的权限和视图。
理想情况下,我想将它们拆分成单独的 Db,但仍然能够保持两者之间的关系。我不认为它可以通过自然 sql query/index 来完成(或者可以吗?)。
首先我应该注意到,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。以下是一些有趣文章的链接及其关于 HN 的讨论:
The End of Microservices, Enough with the microservices, Modules vs Microservices。
但您提到此举是有原因的。在这种情况下,您无法避免两个数据库中某些数据的重复。拆分原始数据库的一种可能方法如下:
- 第一个微服务和相应的数据库负责用户及其拥有的角色集。
- 第二个微服务回答了问题"which rights gives the particular role"。
第一个数据库将具有 User
和 Role
实体,但 Role
实体将只有最少数量的属性 - id
和 name
。
第二个数据库将没有 User
实体,只有 Role
实体,该实体具有此角色提供的有关权利的完整信息。第二个数据库中 Role
对象的 id
和 name
属性应与第一个数据库中的对象具有相同的值。
这样 User
和 Role
实体之间的关系就不会被破坏,因为它们属于同一个数据库。这将有助于保持数据完整性。同时,会有一些操作需要在两个数据库中同步更改——角色创建、重命名和删除。为此,您可以先在 Role 微服务中进行更改,然后将相应的请求发送到 User 微服务。但是您需要实施逻辑,以确保两次更改都没有错误,如果第二次更改不成功,则重试或回滚。
我们有一个使用 Flask/Pony 框架构建的单体应用程序。现在效果很好。
但是,在不久的将来,我们将开始转向微服务架构。在此过程中,我们很可能会为每个服务创建一个单独的 Db。由于一些我不会深入的原因,这是有益的。但是我挂断了电话,我知道很多其他人也在考虑目前表之间发展的外键关系时。
人们通过非规范化他们的数据库解决了这个问题,最终在另一个服务的数据库中出现了重复的表。
我很好奇 Pony 的用户如何看待这个解决方案以及它是否可行。
其他使用 PonyORM 或任何其他 ORM 的人在使用微服务架构时有什么想法?
编辑:
我们现在的数据库很简单:
Main DB
User
|-id
|-name
|-role = Required("Role")
Role
|-id
|-name
|-set("User")
现在这一切都在一个 Db 中,但逻辑在两个不同的服务中。用户服务和角色服务。角色服务控制允许用户访问的权限和视图。
理想情况下,我想将它们拆分成单独的 Db,但仍然能够保持两者之间的关系。我不认为它可以通过自然 sql query/index 来完成(或者可以吗?)。
首先我应该注意到,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。以下是一些有趣文章的链接及其关于 HN 的讨论: The End of Microservices, Enough with the microservices, Modules vs Microservices。
但您提到此举是有原因的。在这种情况下,您无法避免两个数据库中某些数据的重复。拆分原始数据库的一种可能方法如下:
- 第一个微服务和相应的数据库负责用户及其拥有的角色集。
- 第二个微服务回答了问题"which rights gives the particular role"。
第一个数据库将具有 User
和 Role
实体,但 Role
实体将只有最少数量的属性 - id
和 name
。
第二个数据库将没有 User
实体,只有 Role
实体,该实体具有此角色提供的有关权利的完整信息。第二个数据库中 Role
对象的 id
和 name
属性应与第一个数据库中的对象具有相同的值。
这样 User
和 Role
实体之间的关系就不会被破坏,因为它们属于同一个数据库。这将有助于保持数据完整性。同时,会有一些操作需要在两个数据库中同步更改——角色创建、重命名和删除。为此,您可以先在 Role 微服务中进行更改,然后将相应的请求发送到 User 微服务。但是您需要实施逻辑,以确保两次更改都没有错误,如果第二次更改不成功,则重试或回滚。