1. 程式人生 > >java工程積累——saas之multi-tenancy解析

java工程積累——saas之multi-tenancy解析

        最近做的專案涉及到比較深入的一部分,就是定義客戶關係,在我們的商討中,我們決定,採用服務商的模式,就是我們是基礎服務商,由客戶組合服務,向客戶提供基於雲端的服務支援!這就自然引出了以下概念:

saas百科: 

        SaaS是Software-as-a-Service(軟體即服務)的簡稱,隨著網際網路技術的發展和應用軟體的成熟, 在21世紀開始興起的一種完全創新的軟體應用模式。它與“on-demand software”(按需軟體),the application service provider(ASP,應用服務提供商),hosted software(託管軟體)所具有相似的含義。它是一種通過Internet提供軟體的模式,廠商將應用軟體統一部署在自己的伺服器上,客戶可以根據自己實際需求,通過網際網路向廠商定購所需的應用軟體服務,按定購的服務多少和時間長短向廠商支付費用,並通過網際網路獲得廠商提供的服務。使用者不用再購買軟體,而改用向提供商租用基於Web的軟體,來管理企業經營活動,且無需對軟體進行維護,服務提供商會全權管理和維護軟體,軟體廠商在向客戶提供網際網路應用的同時,也提供軟體的離線操作和本地資料儲存,讓使用者隨時隨地都可以使用其定購的軟體和服務。對於許多小型企業來說,SaaS是採用先進技術的最好途徑,它消除了企業購買、構建和維護基礎設施和應用程式的需要。

那麼,問題來了,怎麼針對不同的使用者提供一種高效,安全的基礎資料服務呢?本著我們想到的問題,肯定有人遇到過的原則,我們搜尋到了一個解決方案:

多租戶(multi-tenancy)

  意指在其中一個應用程式的執行例項同時服務多個客戶端(租戶)體系結構。這是非常常見的SaaS解決方案。

關於多租戶的實現,大概有三種:“N個租戶N個數據庫”,“N個租戶1個數據庫N個Schema”,“N個租租戶1個數據庫1個Schema”


1.分離資料庫(Separate Databases)

“N個租戶N個數據庫”

每個租戶的資料儲存在一個物理上獨立的資料庫例項。JDBC連線會特別指出每個資料庫。一個通用的應用程式的方法是定義一個JDBC連線池,當前登入的使用者關聯的"租客識別符號"來選擇JDBC連線.
好處:可以輕鬆地擴充套件應用程式的資料模型(稍後討論)以滿足住戶的個別需求,而且在失敗時從備份恢復租客的資料是一個相對簡單的過程。
壞處:導致更高的裝置成本,以及維護和備份租客資料方面的成本。
相對較高的硬體,維護成本使它適合於願意額外支付增加的安全性和可定製性的客戶。例如,在銀行或醫療記錄管理等領域的客戶往往有很強的資料隔離的要求,甚至不得不不為每個租客提供具有其自己單獨的資料庫。


2.共享資料庫,彼此獨立的Schema(Shared Database, Separate Schemas)

“N個租戶1個數據庫N個Schema”
每個租客有它自己的表,可以理解為為每個租客分表.每個租客在共享的資料庫中具有其自己單獨的一組表.當客戶第一次訂閱該服務時,資源調配子系統為租客建立一組離散的表,並將它與租客的Schema關聯。您可以使用 SQL 建立命令建立一個架構,並授權使用者帳戶來訪問它。應用程式然後可以建立和訪問表內的租戶的架構使用SchemaName.TableName公約:
CREATE TABLE ContosoSchema.Resumes (EmployeeID int identity primary key,Resume nvarchar(MAX));
建立Schema後,它是作為租客帳戶的預設Schema設定:
ALTER USER Contoso WITH DEFAULT_SCHEMA = ContosoSchema
租客帳戶可以訪問其預設架構內的表,只是通過指定TableName,而不是使用SchemaName.TableName.這種方式,一組 SQL 語句可以給所有的租客使用來訪問其自己的資料,例如:SELECT * FROM Resumes

優點:

        這樣是容易實現的一種方法,租戶可以與單獨的資料庫方法一樣擴充套件資料模型。(建立的表但一旦不符合需求,租客可新增,修改表)

        這種方法提供了中等程度的邏輯資料隔離安全,雖然比不上作為一個完全獨立的資料庫,但卻可以在每個資料庫伺服器支援大量的租戶。

缺點:

        資料出現故障時是難以恢復某租客。如果每個租客有其自己的資料庫,則還原單個租戶的資料意味著簡單地從最近的備份還原資料庫。而這個方法則意味著用備份的資料還原整個資料庫,而不管在同一資料庫上的每個租客的資料是否遭到損失。因此,要還原單個客戶的資料,資料庫管理員可能需要將資料庫還原到一個臨時的伺服器,然後將客戶的表匯入到生產伺服器上 — — 一個複雜和可能很耗時的任務。

3.共享資料庫,共享Schema(Shared Database, Shared Schema)

“N個租租戶1個數據庫1個Schema”
這個方法就是最簡單的一種了.每個表使用租客的一個識別符號.所有租戶都共享一組相同的表,一個租客 識別符號ID 將每個租客與它擁有的行相關聯.

優點:

        最低硬體和備份成本,因為它允許每個資料庫伺服器服務更多的租戶。然而,因為多個租戶共享相同的資料庫表,這種方法可能會導致安全問題,你必須努力確保租戶始終不能訪問其他租戶的資料,即使在發生意外。

缺點:

        對於租客還原資料的過程是類似於共享架構方法,要重新插入臨時資料庫單個行到生產資料庫中。如果有非常大量的受影響的表中的行,這可能導致效能明顯降低資料庫服務的所有住戶。共享架構方法能夠用少量的伺服器,服務一大批租戶和潛在客戶,如果他們願意用更低的費用獲取安全性.

每次CRUD都需要使用對應租客 識別符號ID.SQL變得複雜.

總結:

        SaaS的概念在很久以前,是我們通過部署N個程式來完成的為多個使用者服務,但是在咱們程式的維護上,增加了太多的成本,本著硬體能解決的問題,軟體都能解決,有了這個概念,實際這不是全新的概念,而是為了解決一組問題而提出的解決方案!今天咱們充足了彈藥,在下一篇部落格,咱們一起將它實現吧!