java 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個程序來完成的為多個用戶服務,但是在咱們程序的維護上,增加了太多的成本,本着硬件能解決的問題,軟件都能解決,有了這個概念,實際這不是全新的概念,而是為了解決一組問題而提出的解決方案!今天咱們充足了彈葯,在下一篇博客,咱們一起將它實現吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值