當企業規模越來越大,企業內部擁有多個公司的架構,抑或是產品雲端化時,要如何保證資料正確隔離,同時兼顧資源使用的效率與成本? 多租戶(Multi-Tenancy) 架構的出現讓系統開發有了更大的彈性,本次將介紹 Abp 框架中所提供的多租戶功能,如何讓開發更為便利。
根據 wiki 的定義,Multi-Tenancy 是一種軟體架構, 透過此架構一台 Server 上的 single application instance 可以服務多個租戶(Tenant)。
租戶(Tenant)定義為,由一群用戶組成,共享特定 single application instance 的存取權限。
Single application instance 能在租戶間提供相同甚至可客製化的服務,並且仍可確保各使用者間資料的隔離性,資料不只是指資料庫中的資料,甚至延伸到各個租戶的系統設定。
Multi-tenancy 有下列幾種作法
隨著架構演進,目前最能保有彈性的作法為最後一種,如圖所示,tenants 能夠透過 load balance 存取 application 提供的服務提升效能,而資料庫方面是採 Hybrid 模式,可以有 tenants 共用資料庫的情境,也可以有獨立的資料庫供特定 tenant 使用。
本文將透過以下幾點來介紹 Abp 的 Multi-Tenancy 功能
Abp 在 Multi-Tenancy 中有兩種身份
MultiTenancySide (身份)的產生規則,以 TenantId, UserId 能否被解析出,來決定身份狀態為
若用戶未登入, 則交由 Tenant Resolve Contributors 嘗試解析出 TenantId
內建三個 pre-defined Tenant Resolve Contributors 照順序解析
Determining Current Tenant 其他注意事項
上述 Header 與 Cookie 可以調整預設的 Key 值,需同時設定前後端兩處
Resolver 可透過 Configuration.MultiTenancy.Resolvers 擴充,自訂規則
解析出的 TenantId 會被 cache 住(保證相同 request 的效能),若為未登入狀態,每次 request 都會重新解析 TenantId
下篇會繼續介紹 Multi-Tenancy 的剩餘內容與相關的 Configuration & Feature Management,敬請期待