2011-09-25 216 views
6

我的任務是製作企業應用程序多租戶。它有一個使用SOAP Web服務和PostgreSQL後端的Java/Glassfish BLL。每個租戶都有自己的數據庫,所以(至少在我看來)「多租戶」意味着每個應用服務器支持多個數據庫。爲成熟的企業應用程序實施多租戶

當前單租戶應用服務器使用從配置文件獲取的連接字符串初始化C3P0連接池。我的想法是,現在需要爲每個由應用服務器提供服務的客戶端/數據庫建立一個連接池。

一旦用戶登錄,我可以通過查找其租戶將其映射到正確的連接池。我的主要問題是如何得到這一點 - 當用戶第一次登錄時,後端的User表被查詢並且對應的User對象被提供。看來我需要知道哪個數據庫只能使用一個用戶名才能使用。

我唯一的想法是需要一個「配置」數據庫 - 一個用於管理租戶信息(如連接字符串)的集中式數據庫。 BLL可以查詢此數據庫以獲取足夠的信息來初始化必要的連接池。但由於我只有一個用戶名,所以我似乎也需要一個集中的用戶名查找,換句話說,UserName表與Tenant表的外鍵。

這是我設計計劃開始聞到的地方,給了我懷疑。現在我將在兩個單獨的數據庫中擁有用戶信息,這些數據庫需要同步維護(用戶添加,更新和刪除)。此外,用戶名現在必須是全球唯一的,而之前他們只需要每個租戶都是唯一的。

我強烈懷疑我正在重新發明車輪,或者至少有更好的建築可能。我以前從來沒有做過這種事,我的團隊也沒有人,所以我們的無知。不幸的是,這個應用程序很少使用現有的技術(例如ORM就是自制的),所以我們的路線可能會很艱難。

我要求如下:我現有的設計方案

  • 批評,以及提高或再處理架構的建議。
  • 提供解決此問題的現有技術的建議。我希望在遊戲後期能夠輕鬆插入一些東西,儘管這可能是不現實的。我已閱讀了關於jspirit,但發現它幾乎沒有任何信息 - 任何反饋或其他框架將有所幫助。

UPDATE:該解決方案已成功實施和部署,並已通過初步測試。感謝@mikera他的幫助和令人放心的答案!

回答

5

一些快速的想法:

  • 你一定會需要某種形式的共享用戶管理指數的(否則你不能用正確的目標數據庫實例的客戶端登錄關聯)。不過,我會建議做到這一點非常輕量級,並且只能使用它進行初始登錄。一旦確定了哪個數據庫,您的User對象仍然可以從客戶端特定的數據庫中提取。
  • 您可以使主鍵[clientID,用戶名],以便用戶名不需要在客戶端是唯一的。
  • 除了這個瘦用戶索引層,我會保持大部分用戶信息在客戶端特定數據庫。現在重構這個可能會太破壞性,你應該首先獲得基本的多租戶功能。
  • 您將需要使共享索引與各個客戶端數據庫保持同步。但我認爲這不應該太難。您還可以使用批處理作業「測試」同步並糾正任何錯誤,這可以在一夜之間運行,或者如果出現任何不同步的情況,您可以根據需要由您的DBA運行。我將客戶端數據庫視爲主數據庫,並使用它來根據需要重建共享用戶索引。
  • 隨着時間的推移,你可以重構向完全共享用戶管理層(甚至是完全共享的客戶數據庫,如果你喜歡,但這種保存爲將來的迭代結束.....
+0

+1這個答案是令人放心的,config數據庫會很輕 - 正如你所說的,只有在連接池初始化和用戶名查找過程中才會使用。關於夜間批量作業清理/報告鬆散結束的優點。 –

相關問題