2

我们有一个使用 Flask/Pony 框架构建的单体应用程序。它现在很好用。

但是,在不久的将来,我们将开始转向微服务架构。在这个过程中,我们很可能会为每个服务创建一个单独的 Db。由于许多我不会讨论的原因,这是有益的。但是当考虑目前在表之间开发的外键关系时,我会挂断电话,而且我知道许多其他人也会挂断电话。

人们通过非规范化他们的数据库最终在另一个服务的数据库中重复表来解决这个问题。

我很好奇 pony 的用户对这个解决方案的看法以及它是否可行。

在使用微服务架构时,其他使用 PonyORM 或任何其他 ORM 的人有什么想法?

编辑:

我们现在的数据库很简单:

Main DB
User
|-id
|-name
|-role = Required("Role")
Role
|-id
|-name
|-set("User")

现在这一切都在一个 Db 中,但逻辑在两个不同的服务中。用户服务和角色服务。角色服务控制允许用户访问的权限和视图。

理想情况下,我想将这些拆分为单独的 Db,但仍然能够保持两者之间的关系。我不认为它可以通过自然的 sql 查询/索引来完成(或者可以吗?)。

4

1 回答 1

2

首先我应该注意到,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。这里有几个链接指向有趣的文章及其关于 HN 的讨论: 微服务的终结、服务足够了模块与微服务。

但你已经提到,此举是有原因的。在这种情况下,您无法避免两个数据库中某些数据的重复。拆分原始数据库的一种可能方法如下:

  1. 第一个微服务和相应的数据库负责用户及其拥有的角色集。
  2. 第二个微服务回答了“哪些权利赋予了特定角色”的问题。

第一个数据库将具有UserRole实体,但Role实体将只有最少数量的属性 -idname

第二个数据库将没有User实体,只有Role具有该角色提供的有关权限的完整信息的实体。第二个数据库中对象的idname属性Role应该与第一个数据库中的对象具有相同的值。

这样就不会破坏User和实体之间的关系,因为它们属于同一个数据库。Role这将有助于保持数据完整性。同时,也会有一些需要在两个数据库中同步更改的操作——角色创建、重命名和删除。为此,您可以先在 Role 微服务中进行更改,然后将相应的请求发送到 User 微服务。但是您需要实现逻辑,以确保两次更改都没有错误,如果第二次更改不成功,则重试或回滚。

于 2017-06-05T02:02:52.203 回答