模組化單體應用的資料隔離

張哥說技術發表於2023-12-20

來源:小技術君

模組化單體應用是一種日益流行的架構方法,它結合了模組化和單體設計的優點。

模組化單體試圖解決單體和微服務架構的不足之處。

我經常看到的單體架構問題之一是元件之間的緊耦合。

這導致系統不同部分之間存在依賴關係。

模組化單體透過定義良好的模組邊界和通訊模式來強制執行更好的架構實踐。

但一個你不能忽視的方面是模組之間的資料隔離。

資料隔離確保模組相互獨立且耦合度低。

今天,我將向你展示模組化單體的四種資料隔離方法:

分離表分離模式分離資料庫不同持久化

為什麼資料隔離很重要?

首先讓我們瞭解在模組化單體架構中為什麼資料隔離很重要。

模組化單體對資料完整性有嚴格的規定:

每個模組只能訪問自己的表沒有共享表或物件的情況只允許在同一模組的表之間進行連線

模組化單體中的模組應該是自包含的。每個模組處理自己的資料。其他模組可以使用模組的公共 API 訪問該資料。

這種設計有哪些好處呢?

保持模組相互隔離有助於促進模組化和松耦合。引入新的系統更改變得更容易。在元件松耦合時,副作用會減少。

如果你使用關聯式資料庫,你仍然可以保持參照完整性。提取表時移除外來鍵不是問題。

模組化單體應用的資料隔離

等級 1 — 分離表

最簡單的解決方案是在資料庫級別沒有隔離。所有模組的表都儲存在一個資料庫中。很難確定哪些表屬於哪個模組。

我只是出於完整性考慮提到這種方法。

然而,表越多,保持它們在模組之間的隔離就越困難。

你可以透過在表之間新增邏輯隔離來改進這一點。

模組化單體應用的資料隔離

等級 2 — 分離模式

在資料庫中分組相關的表是引入邏輯隔離的一種方式。你可以使用資料庫模式來實現這一點。每個模組都有一個包含該模組表的唯一模式。

現在,很容易區分哪個模組包含哪些表。

使用多個 EF Core 資料庫上下文是實現此目的的一種簡單方法。

你還可以引入規則來阻止從其他模組查詢資料。例如,你可以使用架構測試來實現這一點。

在構建模組化單體時,我總是從邏輯資料隔離開始。

但如果這還不夠呢?

模組化單體應用的資料隔離

等級 3 — 分離資料庫

下一個資料隔離級別是將每個模組的資料移至單獨的資料庫。與使用模式進行資料隔離相比,這種方法有更多的約束。

如果你需要模組之間嚴格的資料隔離規則,這是正確的方法。但是,缺點是操作上更加複雜。你必須管理多個資料庫的基礎設施。

然而,這是提取模組的絕佳步驟。

首先,你將要提取的模組的表移動到單獨的資料庫中。這也迫使你解決模組之間的任何資料庫耦合問題。一旦將表移動到單獨的資料庫,你就準備好提取該模組了。

我們能否進一步實現模組資料隔離?

模組化單體應用的資料隔離

等級 4 — 不同持久化

誰說你必須為所有模組使用相同的資料庫型別?

我大多數時間都使用關係(SQL)資料庫。關聯式資料庫很棒,解決了各種問題。但有時,文件或圖形資料庫是更好的解決方案。

這裡的思路類似:使用單獨的資料庫進行資料隔離。

但是,你可以引入不同的資料庫型別來解決特定問題。例如,你可以為一個模組使用關聯式資料庫,而為另一個模組使用圖形或列儲存資料庫。你還必須在應用程式中維護不同的持久化模型。

對於你的使用案例來說,這可能是一種有價值的

權衡。但需要仔細規劃。

模組化單體應用的資料隔離

總結

如果你暫時不需要微服務,模組化單體是一個很好的選擇。你可以將應用程式作為單體進行開發,並在系統內部建立明確的邊界。你仍然可以提取模組並轉移到微服務。但是模組化單體可以更快地進行開發。

模組必須遵守一些規則。它們只能訪問自己的表。它們不能與其他模組共享表。它們不能直接查詢其他模組的表。這些規則有助於實現模組之間的資料隔離。

但是你仍然必須在資料庫級別實現資料隔離。

有四種選項供你選擇:

分離表分離模式分離資料庫不同持久化

我總是選擇使用模式進行邏輯隔離。這很容易實現,並幫助我更好地理解我的邊界。根據要求,我可以隨後引入單獨的資料庫。希望這有所幫助。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024923/viewspace-3000692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章