2017-05-31 96 views
2

我們有一個使用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我會盡我所能。 –

回答

2

首先我應該注意的是,將應用程序拆分爲微服務並不總是一個好主意,因爲它會增加更多的複雜性。以下是幾篇有趣的文章及其在HN上的討論鏈接: The End of Microservices,Enough with the microservices,Modules vs Microservices

但是你已經提到過這個舉動是有原因的。在這種情況下,您無法避免重複使用兩個數據庫中的某些數據。其中一個可能的方式來分割原始數據庫如下:

  1. 第一微服務和相應的數據庫是負責用戶和組有作用的。
  2. 第二個微服務回答了「哪個權利賦予特定角色」的問題。

的第一個數據庫將有UserRole實體,但Role實體只會有屬性的最少數量 - idname

第二個數據庫將沒有User實體,只有Role實體具有有關該角色提供的權限的完整信息。第二個數據庫中的Role對象的idname屬性應該與第一個數據庫中的對象具有相同的值。

這樣,UserRole實體之間的關係就不會被破壞,因爲它們屬於同一個數據庫。這將有助於保持數據的完整性。同時,還有一些操作需要在兩個數據庫中進行同步更改 - 角色創建,重命名和刪除。爲此,您可以首先在角色微服務中進行更改,然後將相應的請求發送到用戶微服務。但是,您需要實現確保兩個更改都沒有錯誤的邏輯,如果第二個更改不成功,則重試或回滾。

+0

我聽說過有關微服務問題的一般情況,但我認爲無論如何我們都會朝這個方向發展。關於維持這種關係,這是我設想的答案。它幾乎是另一項服務之上的服務,以控制其下的服務不受同步的影響。 –