模塊化單體應(yīng)用的數(shù)據(jù)隔離
模塊化單體應(yīng)用是一種日益流行的架構(gòu)方法,它結(jié)合了模塊化和單體設(shè)計的優(yōu)點,模塊化單體試圖解決單體和微服務(wù)架構(gòu)的不足之處。
我經(jīng)??吹降膯误w架構(gòu)問題之一是組件之間的緊耦合,這導(dǎo)致系統(tǒng)不同部分之間存在依賴關(guān)系。模塊化單體通過定義良好的模塊邊界和通信模式來強制執(zhí)行更好的架構(gòu)實踐。

但一個你不能忽視的方面是模塊之間的數(shù)據(jù)隔離,數(shù)據(jù)隔離確保模塊相互獨立且耦合度低。
今天,我將向你展示模塊化單體的四種數(shù)據(jù)隔離方法:
- 分離表
 - 分離模式
 - 分離數(shù)據(jù)庫
 - 不同持久化
 
為什么數(shù)據(jù)隔離很重要?
首先讓我們了解在模塊化單體架構(gòu)中為什么數(shù)據(jù)隔離很重要。
模塊化單體對數(shù)據(jù)完整性有嚴格的規(guī)定:
- 每個模塊只能訪問自己的表
 - 沒有共享表或?qū)ο蟮那闆r
 - 只允許在同一模塊的表之間進行連接
 
模塊化單體中的模塊應(yīng)該是自包含的。每個模塊處理自己的數(shù)據(jù)。其他模塊可以使用模塊的公共 API 訪問該數(shù)據(jù)。
這種設(shè)計有哪些好處呢?
保持模塊相互隔離有助于促進模塊化和松耦合。引入新的系統(tǒng)更改變得更容易。在組件松耦合時,副作用會減少。
如果你使用關(guān)系數(shù)據(jù)庫,你仍然可以保持參照完整性。提取表時移除外鍵不是問題。

等級 1 — 分離表
最簡單的解決方案是在數(shù)據(jù)庫級別沒有隔離。所有模塊的表都存儲在一個數(shù)據(jù)庫中。很難確定哪些表屬于哪個模塊。
我只是出于完整性考慮提到這種方法。
然而,表越多,保持它們在模塊之間的隔離就越困難。
你可以通過在表之間添加邏輯隔離來改進這一點。

等級 2 — 分離模式
在數(shù)據(jù)庫中分組相關(guān)的表是引入邏輯隔離的一種方式。你可以使用數(shù)據(jù)庫模式來實現(xiàn)這一點。每個模塊都有一個包含該模塊表的唯一模式。
現(xiàn)在,很容易區(qū)分哪個模塊包含哪些表。
使用多個 EF Core 數(shù)據(jù)庫上下文是實現(xiàn)此目的的一種簡單方法。
你還可以引入規(guī)則來阻止從其他模塊查詢數(shù)據(jù)。例如,你可以使用架構(gòu)測試來實現(xiàn)這一點。
在構(gòu)建模塊化單體時,我總是從邏輯數(shù)據(jù)隔離開始。
但如果這還不夠呢?

等級 3 — 分離數(shù)據(jù)庫
下一個數(shù)據(jù)隔離級別是將每個模塊的數(shù)據(jù)移至單獨的數(shù)據(jù)庫。與使用模式進行數(shù)據(jù)隔離相比,這種方法有更多的約束。
如果你需要模塊之間嚴格的數(shù)據(jù)隔離規(guī)則,這是正確的方法。但是,缺點是操作上更加復(fù)雜。你必須管理多個數(shù)據(jù)庫的基礎(chǔ)設(shè)施。
然而,這是提取模塊的絕佳步驟。
首先,你將要提取的模塊的表移動到單獨的數(shù)據(jù)庫中。這也迫使你解決模塊之間的任何數(shù)據(jù)庫耦合問題。一旦將表移動到單獨的數(shù)據(jù)庫,你就準備好提取該模塊了。
我們能否進一步實現(xiàn)模塊數(shù)據(jù)隔離?

等級 4 — 不同持久化
誰說你必須為所有模塊使用相同的數(shù)據(jù)庫類型?
我大多數(shù)時間都使用關(guān)系(SQL)數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫很棒,解決了各種問題。但有時,文檔或圖形數(shù)據(jù)庫是更好的解決方案。
這里的思路類似:使用單獨的數(shù)據(jù)庫進行數(shù)據(jù)隔離。
但是,你可以引入不同的數(shù)據(jù)庫類型來解決特定問題。例如,你可以為一個模塊使用關(guān)系數(shù)據(jù)庫,而為另一個模塊使用圖形或列存儲數(shù)據(jù)庫。你還必須在應(yīng)用程序中維護不同的持久化模型。
對于你的使用案例來說,這可能是一種有價值的
權(quán)衡。但需要仔細規(guī)劃。

總結(jié)
如果你暫時不需要微服務(wù),模塊化單體是一個很好的選擇。你可以將應(yīng)用程序作為單體進行開發(fā),并在系統(tǒng)內(nèi)部建立明確的邊界。你仍然可以提取模塊并轉(zhuǎn)移到微服務(wù)。但是模塊化單體可以更快地進行開發(fā)。
模塊必須遵守一些規(guī)則。它們只能訪問自己的表。它們不能與其他模塊共享表。它們不能直接查詢其他模塊的表。這些規(guī)則有助于實現(xiàn)模塊之間的數(shù)據(jù)隔離。
但是你仍然必須在數(shù)據(jù)庫級別實現(xiàn)數(shù)據(jù)隔離。
有四種選項供你選擇:
?分離表?分離模式?分離數(shù)據(jù)庫?不同持久化
我總是選擇使用模式進行邏輯隔離。這很容易實現(xiàn),并幫助我更好地理解我的邊界。根據(jù)要求,我可以隨后引入單獨的數(shù)據(jù)庫。希望這有所幫助。















 
 
 






 
 
 
 