Pony ORM和微服务架构

问题描述:

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

但是,在不久的将来,我们将开始转向微服务架构。在这个过程中,我们很可能会为每项服务分配一个Db。由于我不会涉及的许多原因,这是有益的。但是当我想到目前桌子之间的外键关系时,我就会挂断电话,而且我也知道很多人也这样做。

人们已经通过将其数据库非规范化到另一个服务的数据库中的重复表格来解决此问题。

我好奇小马的用户怎么看这个解决方案,以及它是否可行。

在使用微服务体系结构时,还有其他人使用PonyORM或其他任何ORM吗?

编辑:

我们的数据库现在的问题是简单化:

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

现在,这一切都是在一个DB但逻辑是两种不同的服务范围内。用户服务和角色服务。角色服务控制授权和视图允许用户被允许访问。

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

+0

嗨安德鲁,你能提供一个简单的例子你的模式,你要拆分成不同的数据库吗? –

+0

@AlexeyMalashkevich我会尽我所能。 –

首先我应该注意的是,将应用程序拆分为微服务并不总是一个好主意,因为它会增加更多的复杂性。以下是几篇有趣的文章及其在HN上的讨论链接: The End of Microservices,Enough with the microservices,Modules vs Microservices

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

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

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

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

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

+0

我听说过有关微服务问题的一般情况,但我认为无论如何我们都会朝这个方向发展。关于维持这种关系,这是我设想的答案。它几乎是另一项服务之上的服务,以控制其下的服务不受同步的影响。 –