2015-12-28 170 views
14

我正在嘗試構建一個基於Web的SaaS解決方案,並且我碰到了一個不確定使用多租戶或多實例的道路。我會試着描述我想要達到的目標,並且每種方法都有優點和缺點(根據我的看法,我認爲)。請包括您的建議,以防我錯過了其中一種方法。多租戶或多實例?

,我試圖建立的應用程序是,正如我所說,一個SaaS解決方案,企業可以建立自己的賬戶,每個賬戶/公司有它自己的用戶,客戶,產品,服務...等。每個用戶;誰是公司員工;與一個帳戶/公司相關的用戶只能訪問其公司客戶,產品和服務。公司可以擁有無​​限數量的客戶,產品和服務,因此每家公司都應該擁有自己的數據中心。

對於我決定創建一個共享數據庫(節省用於登錄的所有用戶憑證)和多個數據庫共享模式(每用戶/企業數據庫)。基本上,多租戶

然後有人建議使用多實例代替,每個公司都會有自己的應用程序(即代碼庫,數據庫,框架...等),從其他公司完全分開的實例。這聽起來更好,因爲我不需要照顧額外的層,我需要確保每個租戶的用戶只能訪問其公司的數據。我認爲這是很好的一提的是,我根據Docker實現這種方法(我以前從來沒有使用過),但我認爲它缺乏(這些後來更多),我將需要在未來的功能(至少我沒有發現他們有一點搜索)。

然而,每個方法有以下優點和缺點,所以我不能讓與方式去決定。這裏列出了一個列表,但是由於我缺乏這兩方面的知識,所以可能有些我不知道的東西,或者是我在網絡上找不到的問題的解決方案:[每種方法都有的有序列表,其中I,接着爲一個比較的一個]

多租約

  1. 共享主機/硬件,共享代碼,和多數據庫。
  2. 容易擴展代碼的功能並修復錯誤(共享代碼)。
  3. 這是更難延長硬件(可以使用雲服務),或個別租戶的數據庫移動到另一個系統沒有做修改代碼。
  4. 最重要的是,正如我之前提到的,我需要爲系統添加一個額外的層,以確保用戶實際上屬於他/她的公司,而不是訪問其他公司的信息。

多實例

  1. 共享或每個實例非共享主機/硬件,每個實例代碼,和數據庫。
  2. 這是更難擴展功能或修復錯誤(我不確定是否有方法在Docker中執行此操作,您可以將功能/功能添加到一個實例或Docker容器,並將其部署到其他)。
  3. 它的更容易將整個實例移動到不同的主機/硬件。
  4. 作爲實例,我不需要照顧該層,因爲每個實例都有自己的數據庫。

所有的優點和缺點的情況下,多餘的我想手動做任何事情(如手動爲每個租戶創建一個實例),這就是爲什麼我懷疑泊塢窗的解決方案,除非有解決辦法這可能是問題的主要原因。如果您能夠參考解決方案回答問題,我將不勝感激,您爲什麼認爲這種方法比其他方法更好?

如果這有助於(也許?),我們使用Laravel作爲後端(所有RESTfully)的主要框架。

回答

3

其他人之前有過這些問題。例如。有某事。那裏叫SaaS Maturity Model。我認爲大多數成功的模式都是從功能開始的,平臺作爲次要的關注點。所以我會首先爲每個客戶策略提供一個實例。無論如何,一開始會有多少客戶?是否更有可能失敗,因爲客戶不喜歡功能,或者因爲您使用多個實例會帶來運營開銷?

=>首先關注產品/功能。因此,瞄準1級,稍後再關注其他級別。

隨着Docker(至少從我的角度來看,作爲一個人,這並沒有做很多與它):你的發展的神器是一個可運行的容器圖像。將此工件發佈到存儲庫時,更新所有實例以使用此新工件應該非常容易。所以有了一點腳本或許可以。例如Kubernetes應該可以將很多實例移動到新版本。所以我認爲像Docker這樣的新發展讓多實例設置更加可行。

我也爲我們公司做了一個SaaS產品。對我們來說,由於業務問題,它也是多實例:

  1. 我們的客戶非常熱衷於將數據與競爭對手分開。使用多實例策略更容易。
  2. 客戶有時需要對發佈週期進行一些控制。例如,他們必須向員工傳達功能變化,或正在進行不允許升級的業務流程。所以他們可能想要等待一個新版本甚至跳過它。每個客戶的實例再次更容易。

一如既往地與這些類型的問題,我在這裏給出我的觀點和我的經驗。這真的取決於你的用例 - SaaS有很多種類。

+0

謝謝。我會從一開始就回答你的問題。開始時會有兩個客戶(公司),所以有兩個客戶。對於第二個問題,只是另一個SaaS,它可能是成功或失敗,但是,至少會有兩個客戶。整個事情取決於用例是可以理解的,但您引用的成熟度模型將多實例解決方案視爲較低級別(級別1),而將其他多租戶解決方案(級別2)視爲較高級別,但是我不要這樣看。它也沒有提到任何關於從關卡移動到另一個關卡...... – Anas

6

如果每個客戶都要共享模式,則不需要不同的數據庫。大多數SaaS軟件都是多租戶,以這種方式工作,這是一種具有應用程序邏輯的通用數據庫,用於確保用戶只能訪問應該允許訪問的內容。例如。 Facebook沒有數十億個數據庫,每個用戶都有一個數據庫,以確保我們無法看到彼此的非公開照片。

此外,您嘗試解決的問題看起來好像不應該影響應用程序的可移植性或將其移至雲端的能力。如果你treat backing services, e.g. database(s), as attached resources那麼它是否真的很重要,如果你有一個或很多(但我仍然建議你只有一個)。

我建議您閱讀12-factor principles進行SaaS開發和部署。他們是考慮構建在雲本地環境中輕鬆工作的軟件的理想起點。我將專注於解決軟件的業務問題,並以雲本地方式構建它,例如根據12因素原則。

關於你所描述的問題,沒有任何事情表明Docker與非Docker甚至是目前相關的問題。即所有您提出的方法可以在沒有Docker的情況下以相當類似的方式完成。 Docker解決了進程隔離,打包操作系統級別的依賴關係,減少計算資源開銷,開發和生產之間的一致性等問題,而且似乎與您所追求的內容間接相關。

+0

感謝您的回答。我明白了爲什麼你說我不需要爲每個租戶提供數據庫,因爲我有一個共享模式,但我的假設取決於兩件事情:首先,租戶可能在其數據中心中擁有大量數據,而另一個則會少一些。因此,金額較少的人會遭受性能(可能?)。其次,一些租戶可能需要擴展服務(需要一個新表),將一個租戶的數據庫(添加代碼)包含在一個數據庫中(需要修改代碼)會更容易... – Anas

+3

「首先,租戶可能在他/她的數據中心中擁有大量的數據,而另一個數據中心的數據量會少一些,因此數量較少的那個會遭受性能影響(或許?)「或者可能不是?對於每個租戶而言,優化查詢的解決方案都比不同的數據庫更好。 「其次,一些租戶可能需要擴展服務(需要一個新表),將一個租戶的數據庫(添加代碼)包含在一個數據庫(需要修改代碼)中會更容易。」對於這種事情,有更好的,更「雲原生」的模式...... –

+4

你可能想要考慮一個類似微服務的架構。您可以擁有一個單獨的前端,它可以通過API與不同的後端服務進行通信,並且只向相關用戶公開相關服務。針對不同服務的不同數據庫是有意義的,而不是針對不同租戶。我不會從每個用戶都會得到完全不同的服務的計劃開始。 –

3

多租戶是要走的路,它是成本效益和更易於維護。想象一下,您在10個不同版本的應用程序中有10個客戶,支持他們變得非常重要。藉助多租戶,您可以根據負載進行自動調整,並在負載較小時縮小規模,但多實例可能必須確保每個客戶至少有一個實例可用。

很少有其他原因,我將與多租戶去

  1. 一個版本來構建和部署
  2. 共享資源,如緩存
  3. 測試您的應用程序只有一個版本
  4. 安全性測試將是簡化
  5. 有效利用CDN