我的任務是製作企業應用程序多租戶。它有一個使用SOAP Web服務和PostgreSQL後端的Java/Glassfish BLL。每個租戶都有自己的數據庫,所以(至少在我看來)「多租戶」意味着每個應用服務器支持多個數據庫。爲成熟的企業應用程序實施多租戶
當前單租戶應用服務器使用從配置文件獲取的連接字符串初始化C3P0連接池。我的想法是,現在需要爲每個由應用服務器提供服務的客戶端/數據庫建立一個連接池。
一旦用戶登錄,我可以通過查找其租戶將其映射到正確的連接池。我的主要問題是如何得到這一點 - 當用戶第一次登錄時,後端的User
表被查詢並且對應的User
對象被提供。看來我需要知道哪個數據庫只能使用一個用戶名才能使用。
我唯一的想法是需要一個「配置」數據庫 - 一個用於管理租戶信息(如連接字符串)的集中式數據庫。 BLL可以查詢此數據庫以獲取足夠的信息來初始化必要的連接池。但由於我只有一個用戶名,所以我似乎也需要一個集中的用戶名查找,換句話說,UserName
表與Tenant
表的外鍵。
這是我設計計劃開始聞到的地方,給了我懷疑。現在我將在兩個單獨的數據庫中擁有用戶信息,這些數據庫需要同步維護(用戶添加,更新和刪除)。此外,用戶名現在必須是全球唯一的,而之前他們只需要每個租戶都是唯一的。
我強烈懷疑我正在重新發明車輪,或者至少有更好的建築可能。我以前從來沒有做過這種事,我的團隊也沒有人,所以我們的無知。不幸的是,這個應用程序很少使用現有的技術(例如ORM就是自制的),所以我們的路線可能會很艱難。
我要求如下:我現有的設計方案
- 批評,以及提高或再處理架構的建議。
- 提供解決此問題的現有技術的建議。我希望在遊戲後期能夠輕鬆插入一些東西,儘管這可能是不現實的。我已閱讀了關於jspirit,但發現它幾乎沒有任何信息 - 任何反饋或其他框架將有所幫助。
UPDATE:該解決方案已成功實施和部署,並已通過初步測試。感謝@mikera他的幫助和令人放心的答案!
+1這個答案是令人放心的,config數據庫會很輕 - 正如你所說的,只有在連接池初始化和用戶名查找過程中才會使用。關於夜間批量作業清理/報告鬆散結束的優點。 –