在本系列的第二篇文章中(使用 IBM 中間件實(shí)現 SaaS 解決方案,第 2 部分:?jiǎn)⒂枚嘧鈶?hù)的方法),我們討論了啟用多租戶(hù)的三種方法,即虛擬化、中介和共享。本文主要討論第三種方法,介紹如何使用單一共享應用程序實(shí)例同時(shí)支持多個(gè)客戶(hù)組織(即租戶(hù)),實(shí)現經(jīng)濟有效性目標。我們要使用 IBM 中間件開(kāi)發(fā)一個(gè)經(jīng)濟有效、安全且可配置的多租戶(hù)應用程序。我們主要關(guān)注多租戶(hù)應用程序設計和實(shí)現的三個(gè)關(guān)鍵方面:
為了便于讀者理解,我們設計了一個(gè)示例應用程序 EasyOA,它應該有助于解釋如何使用 IBM 中間件產(chǎn)品(尤其是 IBM WebSphere Application Server (WAS)、DB2、Tivoli Directory Server (TDS) 和 WebSphere Process Server (WPS))實(shí)現多租戶(hù)模型。
![]() ![]() |
![]() |
如圖 1 所示,基于資源共享的多租戶(hù)啟用模式分為兩類(lèi):1) 多個(gè)應用程序實(shí)例和 2) 單一共享應用程序實(shí)例。前者為每個(gè)租戶(hù)提供專(zhuān)用的應用程序實(shí)例,這些實(shí)例在共享的硬件、操作系統或中間件服務(wù)器上運行。后者用單一共享應用程序實(shí)例支持許多租戶(hù),這個(gè)實(shí)例包含各種資源。這兩種模式可以支持的租戶(hù)數量差異很大。多實(shí)例方法用來(lái)支持幾個(gè)(最多幾十個(gè))租戶(hù),每個(gè)租戶(hù)可能有數百位用戶(hù),使用一組服務(wù)器。單一共享實(shí)例方法用來(lái)支持大量小型租戶(hù),租戶(hù)數量常常是數百個(gè)、數千個(gè)甚至更多。
應該根據特定的應用場(chǎng)景和目標客戶(hù)的需求選擇資源共享模式。通常,大型企業(yè)喜歡多實(shí)例方法,因為這有助于避免與資源共享相關(guān)聯(lián)的潛在風(fēng)險。對于面向 SMB 客戶(hù)(他們的服務(wù)預訂預算比較少)的大多數服務(wù),為了實(shí)現規模效益,業(yè)務(wù)模型必須通過(guò)吸引大量客戶(hù)增加收入,同時(shí)使用非常高效的可伸縮的多租戶(hù)基礎結構支持這些客戶(hù),降低每個(gè)客戶(hù)的平均服務(wù)交付成本。在這些場(chǎng)景中,多實(shí)例模式是不合適的,因為每個(gè)租戶(hù)帶來(lái)的收入很少,不足以抵償為租戶(hù)分配專(zhuān)用的硬件/軟件資源的成本。
盡管多租戶(hù)應用程序在經(jīng)濟有效性方面非常有優(yōu)勢,但是它們也面對許多難題,尤其是與隔離和定制相關(guān)的問(wèn)題。
首先,應該在各個(gè)租戶(hù)之間支持應用程序級隔離。盡管所有租戶(hù)共享同一個(gè)基礎結構和應用程序實(shí)例,但是從用戶(hù)體驗、服務(wù)質(zhì)量 (QoS) 和管理的角度來(lái)看,租戶(hù)當然希望像專(zhuān)用租戶(hù)那樣訪(fǎng)問(wèn)和使用服務(wù)。因此,在體系結構設計的幾乎所有部分都應該仔細考慮隔離,包括非功能性和功能性?xún)煞矫?,涉及安全性、性能、可用性和管理等?/p>
第二,應該支持租戶(hù)在運行時(shí)定制自己的服務(wù),而不會(huì )影響其他租戶(hù)。在過(guò)去,定制通常需要修改代碼和重新部署應用程序。但是,這種定制模式在多租戶(hù)服務(wù)環(huán)境中是不現實(shí)的。因為所有租戶(hù)共享同一個(gè)應用程序實(shí)例,如果一個(gè)租戶(hù)進(jìn)行這樣的定制,所有租戶(hù)的服務(wù)都會(huì )受到影響,而且在更新期間可能會(huì )中斷服務(wù)。隨著(zhù)租戶(hù)數量的增加,中斷會(huì )越來(lái)越頻繁,導致非常嚴重的服務(wù)可用性問(wèn)題。因此,一個(gè)租戶(hù)在運行時(shí)的定制不應該影響其他租戶(hù),這是多租戶(hù)應用程序的關(guān)鍵需求之一。
![]() ![]() |
對于 J2EE/SOA 應用程序,有許多種可訪(fǎng)問(wèn)的資源,在用戶(hù)界面、業(yè)務(wù)邏輯、過(guò)程/工作流和數據模型等層上還有各種運行時(shí)工件。為了設計非常高效的多租戶(hù)應用程序,我們需要通過(guò)以下兩個(gè)步驟小心地管理這些資源:
表 1 簡(jiǎn)要總結這些重要的資源以及相應的共享、隔離和定制機制。在本系列的后續文章中,我們將詳細介紹它們。
| 組件 | 共享的資源 | 隔離方法 | 可配置方法 |
| 持久化數據模型 | - | - | - |
| 數據庫服務(wù)器(JDBC、SDO 等) | 數據源,連接池 數據庫賬戶(hù) 數據庫/模式/表/緩沖區池等 | 存儲隔離:專(zhuān)用的表/模式或數據庫,或共享的表/模式 訪(fǎng)問(wèn)隔離:通過(guò)專(zhuān)用數據源和連接實(shí)現 DBMS 級訪(fǎng)問(wèn)控制,或通過(guò)篩選器實(shí)現應用程序級訪(fǎng)問(wèn)控制 | 數據庫/表/模式 固定的保留字段 擴展的子表 XML 擴展字段 |
| 文件和 I/O | 目錄 文件 | 專(zhuān)用的目錄/文件 共享的文件,使用與租戶(hù)相關(guān)的篩選器 | 目錄結構或文件格式 |
| 目錄服務(wù)器 (LDAP) | 目錄樹(shù) 模式 | 每個(gè)租戶(hù)專(zhuān)用的子樹(shù) 共享的樹(shù),使用與租戶(hù)相關(guān)的篩選器 | 目錄樹(shù)結構和模式定義 |
| 業(yè)務(wù)邏輯 | - | - | - |
| 身份驗證/授權 | 組織結構/特權存儲庫 登錄/授權模塊 | 根據持久化數據模型(LDAP、數據庫等)隔離的存儲庫 擴展的感知租戶(hù)的用戶(hù)注冊插件 | 組織結構、角色、特權及其映射關(guān)系 |
| 全局 Java 對象 | 靜態(tài)變量 單實(shí)例類(lèi)的變量 | 每個(gè)租戶(hù)專(zhuān)用的(靜態(tài))變量,使用容器對象 | N/A |
| 遠程訪(fǎng)問(wèn)(套接字/Http、RMI、CORABA、JNDI、Web 服務(wù)) | 遠程服務(wù) URI、端口號、用戶(hù)名、密碼等連接參數 | 專(zhuān)用的遠程服務(wù) 共享的遠程服務(wù),把租戶(hù)信息傳播給遠程服務(wù) | 連接參數 |
| EJB | 有狀態(tài) EJB 實(shí)例 數據源連接,實(shí)體 Bean 的表 隊列,發(fā)送者的 MDB 標識 | 每個(gè)租戶(hù)專(zhuān)用的有狀態(tài) EJB 實(shí)例、MDB、隊列 共享的實(shí)體 Bean,使用與租戶(hù)相關(guān)的篩選器 共享的 MDB,在消息中嵌入租戶(hù)標識信息 | 共享的實(shí)體 Bean 的保留屬性 可定制的消息格式 |
| 日志 | 日志文件位置、內容、格式和配置 | 專(zhuān)用的日志文件 共享的日志文件,使用與租戶(hù)相關(guān)的篩選器 | 日志格式和設置參數 |
| 緩存 | 緩存容器 | 專(zhuān)用的緩存容器 共享的緩存容器,使用與租戶(hù)相關(guān)的篩選器 | 緩存設置參數 |
| UI | - | - | - |
| JSP | 應用程序范圍的變量(tag、usebean、applicationContext 等) 聲明變量 徽標、樣式、布局等 | 使用與租戶(hù)相關(guān)的篩選器選擇應用程序范圍的變量 專(zhuān)用的聲明變量 | CSS、布局、圖片等 |
| servlet | 單線(xiàn)程 servlet servletContext | 單線(xiàn)程 servlet 使用專(zhuān)用的 servlet 使用與租戶(hù)相關(guān)的篩選器選擇 servletContext 變量 | N/A |
| 過(guò)程/工作流 | - | - | - |
| BPEL 過(guò)程模板 | 模板級屬性、活動(dòng)、鏈接條件等 | 專(zhuān)用的過(guò)程模板 共享的模板,在過(guò)程實(shí)例中使用與租戶(hù)相關(guān)的篩選器 | 過(guò)程模板的骨架 |
| 人工任務(wù) | 動(dòng)作、任務(wù) UI 等 | 擴展動(dòng)作,支持根據啟動(dòng)者的租戶(hù)信息隔離人員選擇機制 | UI 元素和共享任務(wù)的設置 人員選擇規則 |
| 業(yè)務(wù)規則 | 規則 | 專(zhuān)用的業(yè)務(wù)規則 共享的業(yè)務(wù)規則,使用與租戶(hù)相關(guān)的篩選器作為規則參數 | 業(yè)務(wù)規則的規則值設置 |
| 組件 | 共享的資源 | 隔離方法 | 可配置方法 |
| 持久化數據模型 | - | - | - |
| 數據庫服務(wù)器(JDBC、SDO 等) | 數據源,連接池 數據庫賬戶(hù) 數據庫/模式/表/緩沖區池等 | 存儲隔離:專(zhuān)用的表/模式或數據庫,或共享的表/模式 訪(fǎng)問(wèn)隔離:通過(guò)專(zhuān)用數據源和連接實(shí)現 DBMS 級訪(fǎng)問(wèn)控制,或通過(guò)篩選器實(shí)現應用程序級訪(fǎng)問(wèn)控制 | 數據庫/表/模式 固定的保留字段 擴展的子表 XML 擴展字段 |
| 文件和 I/O | 目錄 文件 | 專(zhuān)用的目錄/文件 共享的文件,使用與租戶(hù)相關(guān)的篩選器 | 目錄結構或文件格式 |
| 目錄服務(wù)器 (LDAP) | 目錄樹(shù) 模式 | 每個(gè)租戶(hù)專(zhuān)用的子樹(shù) 共享的樹(shù),使用與租戶(hù)相關(guān)的篩選器 | 目錄樹(shù)結構和模式定義 |
| 業(yè)務(wù)邏輯 | - | - | - |
| 身份驗證/授權 | 組織結構/特權存儲庫 登錄/授權模塊 | 根據持久化數據模型(LDAP、數據庫等)隔離的存儲庫 擴展的感知租戶(hù)的用戶(hù)注冊插件 | 組織結構、角色、特權及其映射關(guān)系 |
| 全局 Java 對象 | 靜態(tài)變量 單實(shí)例類(lèi)的變量 | 每個(gè)租戶(hù)專(zhuān)用的(靜態(tài))變量,使用容器對象 | N/A |
| 遠程訪(fǎng)問(wèn)(套接字/Http、RMI、CORABA、JNDI、Web 服務(wù)) | 遠程服務(wù) URI、端口號、用戶(hù)名、密碼等連接參數 | 專(zhuān)用的遠程服務(wù) 共享的遠程服務(wù),把租戶(hù)信息傳播給遠程服務(wù) | 連接參數 |
| EJB | 有狀態(tài) EJB 實(shí)例 數據源連接,實(shí)體 Bean 的表 隊列,發(fā)送者的 MDB 標識 | 每個(gè)租戶(hù)專(zhuān)用的有狀態(tài) EJB 實(shí)例、MDB、隊列 共享的實(shí)體 Bean,使用與租戶(hù)相關(guān)的篩選器 共享的 MDB,在消息中嵌入租戶(hù)標識信息 | 共享的實(shí)體 Bean 的保留屬性 可定制的消息格式 |
| 日志 | 日志文件位置、內容、格式和配置 | 專(zhuān)用的日志文件 共享的日志文件,使用與租戶(hù)相關(guān)的篩選器 | 日志格式和設置參數 |
| 緩存 | 緩存容器 | 專(zhuān)用的緩存容器 共享的緩存容器,使用與租戶(hù)相關(guān)的篩選器 | 緩存設置參數 |
| UI | - | - | - |
| JSP | 應用程序范圍的變量(tag、usebean、applicationContext 等) 聲明變量 徽標、樣式、布局等 | 使用與租戶(hù)相關(guān)的篩選器選擇應用程序范圍的變量 專(zhuān)用的聲明變量 | CSS、布局、圖片等 |
| servlet | 單線(xiàn)程 servlet servletContext | 單線(xiàn)程 servlet 使用專(zhuān)用的 servlet 使用與租戶(hù)相關(guān)的篩選器選擇 servletContext 變量 | N/A |
| 過(guò)程/工作流 | - | - | - |
| BPEL 過(guò)程模板 | 模板級屬性、活動(dòng)、鏈接條件等 | 專(zhuān)用的過(guò)程模板 共享的模板,在過(guò)程實(shí)例中使用與租戶(hù)相關(guān)的篩選器 | 過(guò)程模板的骨架 |
| 人工任務(wù) | 動(dòng)作、任務(wù) UI 等 | 擴展動(dòng)作,支持根據啟動(dòng)者的租戶(hù)信息隔離人員選擇機制 | UI 元素和共享任務(wù)的設置 人員選擇規則 |
| 業(yè)務(wù)規則 | 規則 | 專(zhuān)用的業(yè)務(wù)規則 共享的業(yè)務(wù)規則,使用與租戶(hù)相關(guān)的篩選器作為規則參數 | 業(yè)務(wù)規則的規則值設置 |
| 組件 | 共享的資源 | 隔離方法 | 可配置方法 |
| 持久化數據模型 | - | - | - |
| 數據庫服務(wù)器(JDBC、SDO 等) | 數據源,連接池 數據庫賬戶(hù) 數據庫/模式/表/緩沖區池等 | 存儲隔離:專(zhuān)用的表/模式或數據庫,或共享的表/模式 訪(fǎng)問(wèn)隔離:通過(guò)專(zhuān)用數據源和連接實(shí)現 DBMS 級訪(fǎng)問(wèn)控制,或通過(guò)篩選器實(shí)現應用程序級訪(fǎng)問(wèn)控制 | 數據庫/表/模式 固定的保留字段 擴展的子表 XML 擴展字段 |
| 文件和 I/O | 目錄 文件 | 專(zhuān)用的目錄/文件 共享的文件,使用與租戶(hù)相關(guān)的篩選器 | 目錄結構或文件格式 |
| 目錄服務(wù)器 (LDAP) | 目錄樹(shù) 模式 | 每個(gè)租戶(hù)專(zhuān)用的子樹(shù) 共享的樹(shù),使用與租戶(hù)相關(guān)的篩選器 | 目錄樹(shù)結構和模式定義 |
| 業(yè)務(wù)邏輯 | - | - | - |
| 身份驗證/授權 | 組織結構/特權存儲庫 登錄/授權模塊 | 根據持久化數據模型(LDAP、數據庫等)隔離的存儲庫 擴展的感知租戶(hù)的用戶(hù)注冊插件 | 組織結構、角色、特權及其映射關(guān)系 |
| 全局 Java 對象 | 靜態(tài)變量 單實(shí)例類(lèi)的變量 | 每個(gè)租戶(hù)專(zhuān)用的(靜態(tài))變量,使用容器對象 | N/A |
| 遠程訪(fǎng)問(wèn)(套接字/Http、RMI、CORABA、JNDI、Web 服務(wù)) | 遠程服務(wù) URI、端口號、用戶(hù)名、密碼等連接參數 | 專(zhuān)用的遠程服務(wù) 共享的遠程服務(wù),把租戶(hù)信息傳播給遠程服務(wù) | 連接參數 |
| EJB | 有狀態(tài) EJB 實(shí)例 數據源連接,實(shí)體 Bean 的表 隊列,發(fā)送者的 MDB 標識 | 每個(gè)租戶(hù)專(zhuān)用的有狀態(tài) EJB 實(shí)例、MDB、隊列 共享的實(shí)體 Bean,使用與租戶(hù)相關(guān)的篩選器 共享的 MDB,在消息中嵌入租戶(hù)標識信息 | 共享的實(shí)體 Bean 的保留屬性 可定制的消息格式 |
| 日志 | 日志文件位置、內容、格式和配置 | 專(zhuān)用的日志文件 共享的日志文件,使用與租戶(hù)相關(guān)的篩選器 | 日志格式和設置參數 |
| 緩存 | 緩存容器 | 專(zhuān)用的緩存容器 共享的緩存容器,使用與租戶(hù)相關(guān)的篩選器 | 緩存設置參數 |
| UI | - | - | - |
| JSP | 應用程序范圍的變量(tag、usebean、applicationContext 等) 聲明變量 徽標、樣式、布局等 | 使用與租戶(hù)相關(guān)的篩選器選擇應用程序范圍的變量 專(zhuān)用的聲明變量 | CSS、布局、圖片等 |
| servlet | 單線(xiàn)程 servlet servletContext | 單線(xiàn)程 servlet 使用專(zhuān)用的 servlet 使用與租戶(hù)相關(guān)的篩選器選擇 servletContext 變量 | N/A |
| 過(guò)程/工作流 | - | - | - |
| BPEL 過(guò)程模板 | 模板級屬性、活動(dòng)、鏈接條件等 | 專(zhuān)用的過(guò)程模板 共享的模板,在過(guò)程實(shí)例中使用與租戶(hù)相關(guān)的篩選器 | 過(guò)程模板的骨架 |
| 人工任務(wù) | 動(dòng)作、任務(wù) UI 等 | 擴展動(dòng)作,支持根據啟動(dòng)者的租戶(hù)信息隔離人員選擇機制 | UI 元素和共享任務(wù)的設置 人員選擇規則 |
| 業(yè)務(wù)規則 | 規則 | 專(zhuān)用的業(yè)務(wù)規則 共享的業(yè)務(wù)規則,使用與租戶(hù)相關(guān)的篩選器作為規則參數 | 業(yè)務(wù)規則的規則值設置 |
| 組件 | 共享的資源 | 隔離方法 | 可配置方法 |
| 持久化數據模型 | - | - | - |
| 數據庫服務(wù)器(JDBC、SDO 等) | 數據源,連接池 數據庫賬戶(hù) 數據庫/模式/表/緩沖區池等 | 存儲隔離:專(zhuān)用的表/模式或數據庫,或共享的表/模式 訪(fǎng)問(wèn)隔離:通過(guò)專(zhuān)用數據源和連接實(shí)現 DBMS 級訪(fǎng)問(wèn)控制,或通過(guò)篩選器實(shí)現應用程序級訪(fǎng)問(wèn)控制 | 數據庫/表/模式 固定的保留字段 擴展的子表 XML 擴展字段 |
| 文件和 I/O | 目錄 文件 | 專(zhuān)用的目錄/文件 共享的文件,使用與租戶(hù)相關(guān)的篩選器 | 目錄結構或文件格式 |
| 目錄服務(wù)器 (LDAP) | 目錄樹(shù) 模式 | 每個(gè)租戶(hù)專(zhuān)用的子樹(shù) 共享的樹(shù),使用與租戶(hù)相關(guān)的篩選器 | 目錄樹(shù)結構和模式定義 |
| 業(yè)務(wù)邏輯 | - | - | - |
| 身份驗證/授權 | 組織結構/特權存儲庫 登錄/授權模塊 | 根據持久化數據模型(LDAP、數據庫等)隔離的存儲庫 擴展的感知租戶(hù)的用戶(hù)注冊插件 | 組織結構、角色、特權及其映射關(guān)系 |
| 全局 Java 對象 | 靜態(tài)變量 單實(shí)例類(lèi)的變量 | 每個(gè)租戶(hù)專(zhuān)用的(靜態(tài))變量,使用容器對象 | N/A |
| 遠程訪(fǎng)問(wèn)(套接字/Http、RMI、CORABA、JNDI、Web 服務(wù)) | 遠程服務(wù) URI、端口號、用戶(hù)名、密碼等連接參數 | 專(zhuān)用的遠程服務(wù) 共享的遠程服務(wù),把租戶(hù)信息傳播給遠程服務(wù) | 連接參數 |
| EJB | 有狀態(tài) EJB 實(shí)例 數據源連接,實(shí)體 Bean 的表 隊列,發(fā)送者的 MDB 標識 | 每個(gè)租戶(hù)專(zhuān)用的有狀態(tài) EJB 實(shí)例、MDB、隊列 共享的實(shí)體 Bean,使用與租戶(hù)相關(guān)的篩選器 共享的 MDB,在消息中嵌入租戶(hù)標識信息 | 共享的實(shí)體 Bean 的保留屬性 可定制的消息格式 |
| 日志 | 日志文件位置、內容、格式和配置 | 專(zhuān)用的日志文件 共享的日志文件,使用與租戶(hù)相關(guān)的篩選器 | 日志格式和設置參數 |
| 緩存 | 緩存容器 | 專(zhuān)用的緩存容器 共享的緩存容器,使用與租戶(hù)相關(guān)的篩選器 | 緩存設置參數 |
| UI | - | - | - |
| JSP | 應用程序范圍的變量(tag、usebean、applicationContext 等) 聲明變量 徽標、樣式、布局等 | 使用與租戶(hù)相關(guān)的篩選器選擇應用程序范圍的變量 專(zhuān)用的聲明變量 | CSS、布局、圖片等 |
| servlet | 單線(xiàn)程 servlet servletContext | 單線(xiàn)程 servlet 使用專(zhuān)用的 servlet 使用與租戶(hù)相關(guān)的篩選器選擇 servletContext 變量 | N/A |
| 過(guò)程/工作流 | - | - | - |
| BPEL 過(guò)程模板 | 模板級屬性、活動(dòng)、鏈接條件等 | 專(zhuān)用的過(guò)程模板 共享的模板,在過(guò)程實(shí)例中使用與租戶(hù)相關(guān)的篩選器 | 過(guò)程模板的骨架 |
| 人工任務(wù) | 動(dòng)作、任務(wù) UI 等 | 擴展動(dòng)作,支持根據啟動(dòng)者的租戶(hù)信息隔離人員選擇機制 | UI 元素和共享任務(wù)的設置 人員選擇規則 |
| 業(yè)務(wù)規則 | 規則 | 專(zhuān)用的業(yè)務(wù)規則 共享的業(yè)務(wù)規則,使用與租戶(hù)相關(guān)的篩選器作為規則參數 | 業(yè)務(wù)規則的規則值設置 |
![]() ![]() |
EasyOA 是一個(gè)為小型企業(yè)開(kāi)發(fā)的簡(jiǎn)單的辦公自動(dòng)化應用程序。這個(gè)應用程序主要包含一個(gè)休假申請過(guò)程。職員可以通過(guò)這個(gè)過(guò)程提出休假申請和查詢(xún)自己的休假歷史,而經(jīng)理通過(guò)這個(gè)過(guò)程批準職員的申請。管理員有權查看公司所有用戶(hù)的操作日志。
EasyOA 是一個(gè)典型的 J2EE 應用程序,它基于以下 IBM 中間件:

EasyOA 在設計時(shí)考慮到了支持多租戶(hù)。如圖 2 所示,支持的主要多租戶(hù)特性如下:
本系列的第 4 部分將全面介紹這些特性的體系結構和實(shí)現。
![]() ![]() |
多租戶(hù)設計模式(使用單一共享應用程序實(shí)例同時(shí)支持多個(gè)租戶(hù))對于提高 Web 應用程序的經(jīng)濟有效性非常重要。在本文中,我們討論了總體體系結構設計原則,以及使用 IBM 中間件開(kāi)發(fā)安全且可配置的多租戶(hù)應用程序的相關(guān)技術(shù)。本文只是概述,后續文章提供關(guān)于這個(gè)主題的詳細信息。
聯(lián)系客服