利用多租戶模式演化成分庫分表和讀寫分離


前言

最近兩周我都發了隨筆寫關於利用EF core實現多租戶,並且給出了一些關於EF 自動遷移的內容。

這個系列的隨筆是想要把這部分的代碼優化和做成類庫的。

我已經整理和抽象好了,本來想介紹一下整理的思路的。但后來發現這里的代碼量太少了,好像沒什么可以說的。

所以這篇隨筆會講解利用這個類庫可以實現的功能。

 

多租戶介紹

按照系列的隨筆介紹,現在主要支持3種模式。分別是: 按表、按Schema和按數據庫分離數據。

支持的數據庫有MySql和SqlServer,並且在我重構的時候,把Postgre也集成進去了。

通過這次的代碼重構,代碼的結構已經不像前面的文章一樣,停留在Demo層面。

代碼修改后,我的目標是同時支持最基本的多租戶,多租戶演變成讀寫分離。

典型的模式

1. 按數據庫分離的模式,可以看到一個DbContext會同時連接3個不同的數據庫,每個庫里面都有一個Product表.

 

 2. 按表分離的模式,這里可以看到一個DbContext只會同時連接一個數據庫,數據庫里面有3個結構相同的Product表,但是它們的名稱是根據前綴區分的。

 

 3. 按Schema分離的模式,這里是一個DbContext只會同時連接一個數據庫,數據庫里面有3個Schema,3個Schema同時具有Product表

 

 

在多租戶的場景下的變型

通過通過數據庫的結構,我們能知道,數據庫、Schema和表是有層級關系的。一個數據庫有n個Schema,一個Schema有n個表。

通過這個層級特性,我們是可以把他變型成4種模式:數據庫和表混合模式、數據庫和Schema混合模式、Schema和表混合模式、數據庫和Schema和表混合模式

但一般來說,后面2中模式把更加多的壓力都同時在一個數據庫,並沒有從硬件/數據庫實例方面進行分離,數據量繼續增長的情況下,最終還是需要通過多個數據庫分離數據。

 

1. 數據庫和表混合模式,可以看到DbContext里面有3個連接分別連接到3個Store Container的數據庫,里面各自存在3個結構相同的數據表。

通過3個Store container,共有9個租戶

 

 

2. 數據庫和Schema混合模式,一個DbContext里面有3個連接連接到3個Store Container的數據庫,里面各自有3個Schema,每個Schema下都有一個結構相同的數據表

通過3個Store Container, 共有9個租戶

 

 

轉變為讀寫分離

在目前的系統中,讀寫分離是的應用更加廣泛。通過下面的圖看出,同一個DbContext下有3個連接分別鏈接到不同的數據庫。數據庫里見面有完全相同的表

其中一個是主庫,2個是從庫。

如果對比我們典型的多租戶模式,其實是非常類型的,顯而易見他們之間是可以互相演變的。事實上我項目中其實就是通過多租戶模式下演變成讀寫分離的。

 

讀寫分離&多租戶圖解

我們這里先看看下圖中的結構。其實這里的圖就是我整個系列的主要流程。其中有幾個關鍵步驟

A. Http Request通過asp.net core的中間件或者攔截器。通過AOP的模式,通過http header和url等, 調用Tenant Generator。

B. Tenant Generator根據調用的接口參數,獲取這是哪一個租戶和API的操作類型(讀或寫),並且講租戶信息和操作類型返回

C. Connection Resolver接收租戶和操作信息的組合,通過配置文件或配置中心獲取具體的連接字符串,並且把連接字符串作為參數傳入到DbContext的構造函數。

D. Db Context利用接收到連接字符串,通過EF core的封裝,自動連接到不同的數據庫。

注:租戶和操作信息的組合,拿store1 & read的組合舉個例子,他的配置的連接字符串的鍵值是 store_read。同理 store2 & write 的鍵值就是store2_write

 

 通過上圖的結構,其實讀寫分離在我們的封裝下,也是能輕而易舉的實現的。估計讀者來到這里會發現有3個關鍵組件是需要用戶自定義才能完成。

分別是中間件或攔截器、Tenant Generator和Connection Resolver。他們3者需要同時維護和使用一個TenantInfo。

 

總結

好了,來到這里已經是本文的結束。是的,本文並沒有貼出任何代碼,僅僅是一個介紹的隨筆。

本文的目的是,讓閱讀者對多租戶和讀寫分離模式有抽象的概念,利用圖和抽象對象盡量描述出這個模式實現下的關鍵是什么。

從系列的第一篇開始,是對多租戶的入門,之后的隨筆是對該模式的深入理解和加深實施辦法。

經過了前面幾篇文章的基礎,通過本文的抽象概念和之前的實施代碼進行融合,從而希望讀者能夠系統地了解到分庫分表。

 

關於代碼

由於之前的代碼都只停留在Demo階段,所以后來我重構了,並且使用了新的Github Repository.

並且我把如何使用的示例代碼都放在了同一個Repository下。

請到這個github地址下獲取重構的代碼:

https://github.com/woailibain/kiwiho.EFcore.MultiTenant

對於這份代碼,由於我也是在最近2天寫的,只做了基礎功能測試,並且事例代碼量有限,我會隨着系列文章的進行中,不斷補充事例代碼也同時修復bug。

其中事例代碼,我會包含今天講到的所有內容。並且我在編寫example的同時,也會發文寫關於怎么使用,為什么這樣使用的詳細。

 

往期文章

如果讀者是首次閱讀本系列,建議閱讀系列的其他文章。因為本文是對前文的總結

Asp.net core下利用EF core實現從數據實現多租戶(1)

Asp.net core下利用EF core實現從數據實現多租戶(2) : 按表分離

EF core (code first) 通過自定義 Migration History 實現多租戶使用同一數據庫時更新數據庫結構

EF core (code first) 通過自動遷移實現多租戶數據分離 :按Schema分離數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM