多租戶saas 架構_[譯/注] Force.com 多租戶互聯網應用開發平臺的設計

原文地址?


http://cloud.pubs.dbs.uni-leipzig.de/sites/cloud.pubs.dbs.uni-leipzig.de/files/p889-weissman-1.pdf

譯注:原文發表于 ACM,2009年6月

作者


  1. Craig D Weissman, CTO, Salesforce.com

  2. Steve Bobrowski, Technical Marketing Consultant, Salesforce.com

摘要


Force.com 是當今杰出的按需應用程序開發平臺,支持著 55000 多個組織。個體企業和商業軟件即服務 (SaaS) 供應商相信該平臺能夠提供強大、可靠的、互聯網規模的應用程序。為了滿足大規模用戶需求,Force.com 通過以元數據驅動的軟件架構為基礎來支持多租戶應用。

本論文的重點是多租戶,這是一種可以大大改善 SaaS 應用程序管理的基本設計方法。本論文定義了多租戶,解釋它的優點,以及說明了為什么元數據驅動的軟件架構是實現多租戶的首選。

目錄結構


1.介紹

2.多租戶應用

3.對比云計算和 PaaS

4.元數據驅動架構

5.架構總覽

6.數據定義和存儲

6.1 對象元數據表

6.2 字段元數據表

6.3 數據表

6.4 CLOBs 表

6.5 索引數據透視表

6.6 UniqueFields 數據透視表

6.7 關系數據透視表

6.8 附加數據透視表

6.9 數據與元數據的分區

7.應用開發、邏輯和處理

7.1 應用框架

7.2 元數據和 Web Service APIs

7.3 通過 API 調用進行批量處理

7.4 刪除、取消刪除和回收站

7.5 數據定義處理

7.6 APEX

8.內部查詢優化

9.全文檢索引擎

10.結論?

正文


1.介紹

歷史表明,每一個在技術上頻繁和增量的進步以及在商業模式上的變更,都會造成軟件應用的主要模式轉型,這種轉型體現在在設計、構建以及對于終端用戶的交付。如今,可靠帶寬的互聯網訪問、面向服務的架構 (SOA),以及效率低下的專用內部部署應用程序管理,這些都推動著向一種可管理、可共享、基于Web Service的交付模式轉型,這種交付模式稱之為軟件即服務 (SaaS)。

2.多租戶應用

為了降低成本,越來越多的應用程序是多租戶的,向許多不同用戶提供相同的應用程序。傳統的單租戶應用程序為了滿足一個組織的需求,要求一組專用的資源;多租戶的應用程序可以通過使用硬件資源和管理單個軟件實例,來滿足多個租戶 (多個公司或者一個公司內的多個部門等) 的需求,如圖1。?

d7517ece02acdce0d573a477265e4706.png

圖1 一個多租戶應用程序共享單一堆棧資源以滿足多個組織的需求

租戶使用同一個多租戶服務,同時能夠實現 (與其他租戶) 相互之間虛擬隔離。組織可以使用和定制一個應用程序,就像它們各自擁有一個單獨的實例一樣,但是他們的數據和自定義設置仍然是安全的,并且與所有其他租戶的活動保持隔離。單個應用程序實例在運行時可以在任何時候對于任何特定租戶進行有效地變形。

譯注:這里的「變形」的理解:對于不同的租戶,功能表現上按需做不同的變更和呈現。

多租戶是一種架構方法,它能夠同時為應用程序供應商和最終用戶帶來收益。通過一個應用程序為多個組織服務,將為應用程序供應商帶來巨大的經濟效益。只需一組硬件資源即可滿足所有用戶的需求,只需要相對較少和經驗豐富的 (運維) 管理人員就能有效地管理一套軟件和硬件,并且開發人員只需要在一個平臺 (操作系統、數據庫等) 上構建和維護一套代碼庫。從經濟上來講,多租戶使得應用軟件提供商能夠更低成本地為客戶服務。

多租戶還有一些有趣的附加好處,包括提升了質量、用戶滿意度和客戶留存率。單租戶應用程序部署在應用程序供應商無法訪問的隔離孤島上,與這不同的是,多租戶應用程序是由供應商本身托管的一個大型社區。這種設計轉變使得供應商可以從用戶群收集操作信息 (如哪些查詢響應慢、發生錯誤等),并對服務進行頻繁、漸進地改進,使得整個用戶社區立即受益。

基于多租戶平臺的兩個附加好處是協作和集成。由于所有用戶在一個空間運行所有應用程序,因此很容易允許任何應用程序的任何用戶對特定的數據集進行不同的訪問。這個能力極大地簡化了集成相關應用程序及其管理的數據所需的工作。?

3.對比云計算和 PaaS

原先的云計算是「以機器為中心」的服務,可以為應用程序部署按需提供基礎設施,即基礎設施即服務 (IaaS)。這樣的云只提供了執行包含應用程序的虛擬服務器所需的計算能力和存儲能力。一些希望快速進入市場的 SaaS 供應商,通過基于 IaaS 實現單租戶實例交付的策略,避免了開發真正多租戶方案的技術挑戰。

譯注:這里可以看出,「基于 IaaS 實現單租戶實例交付」在 salesforce.com 看來是「偽多租戶」。但實際上隨著時代的發展,這也被認為是多租戶的一種形態。后來在 Gartner 定義的多租戶七層模型中,這種屬于「Shared Nothing」或者「Shared Hardware」。

平臺即服務 (PaaS),比如 Force.com,基于一個「以應用為中心」的方法,它抽象了服務器的概念。PaaS 讓開發者在一開始就專注在應用開發,并且通過一鍵部署應用。供應商無需擔心多租戶、高可用、負載均衡、可伸縮性、系統備份、補丁和安全性以及其他基礎架構相關的問題。

譯注:PaaS 鼻祖 Heroku 2007年6月起開始開發,2010年被 Salesforce.com 收購。

4.元數據驅動架構

僅當多租戶可以支持應用 (實現) 可靠、可自定義、可升級、安全和快速 (迭代),它才是實用的。但是,多租戶應用程序如何允許每個租戶為標準的數據對象創建自定義擴展,以及定制全新的自定義數據對象?如何在共享數據庫中確保特定租戶的數據的安全性?租戶如何自定義應用程序的界面和業務邏輯,而不會影響所有其他租戶的應用程序功能或可用性?如何在不破壞租戶自定義內容的情況下,打補丁和升級應用程序?

創建一個靜態編譯的可執行應用程序來滿足這些和其他獨特的多租戶挑戰,這是很困難的。本質上,多租戶應用程序必須本質上是動態的或多態的,才能滿足各種租戶及其用戶的個人期望。

2d332b230e5e47dc6df40a4bcc81f735.png

圖2 定義良好的元數據驅動架構

由于這些原因,多租戶應用程序設計需要演變成,使用一個運行時引擎從元數據 (有關應用程序本身的數據) 生成應用程序組件,見圖2。在定義良好的元數據驅動架構中,已編譯的運行時引擎(內核)、應用程序數據、描述應用程序基本功能的元數據、以及對應租戶數據和定制相關的元數據,這些內容之間有明顯的邊界。有了這些不同的邊界,使得可以獨立更新系統內核、修改核心應用程序或者自定義特定租戶的組件,并且沒有互相影響的風險。?

譯注:從租戶的角度,考慮抽象出系統中變與不變的部分、租戶特有和公用的部分,把系統按照這些分解成有確定邊界的部分。

5.架構總覽

Force.com 經過優化過的元數據驅動架構,可以為按需的多租戶應用提供出色的性能、可伸縮性和可自定義能力。

在 Force.com 中,暴露給開發人員和應用程序用戶的全部內容,在內部表示為元數據。表單、報表、工作流、用戶訪問權限、特定租戶自定義和業務邏輯,甚至是底層數據表和索引的定義,都是抽象結構,僅作為元數據存在于 Force.com 的通用數據字典 (UDD) 中。例如,當開發人員構建新的自定義應用程序并定義一個自定義表、布置表單或編寫一些過程代碼時,Force.com 不會在數據庫中創建「實際」的表或者編譯任何代碼。取而代之的是,Force.com 只是存儲元數據,平臺引擎可以在運行時使用元數據生成「虛擬」的應用程序組件。當某人想要修改或者自定義應用程序的某些內容時,只需要對相應的元數據進行簡單的無阻塞更新即可。

由于元數據是 Force.com 應用程序的關鍵組成部分,因此平臺的運行時引擎必須優化對元數據的訪問;否則,頻繁的元數據訪問將妨礙平臺擴展。考慮到這一潛在瓶頸,Force.com 使用元數據緩存來維護內存中最近使用的元數據,避免降低磁盤 I/O 和代碼重新編譯的性能,并縮短應用程序響應時間。

Force.com 將所有虛擬表的應用程序數據存儲在一些用作堆存儲的大型數據庫表中。然后平臺引擎會在運行時通過考慮相應的元數據來實現 (進行不同的表現) 虛擬表的數據。

為了優化對系統大表中數據的訪問,Force.com 的引擎依賴于一組專門的數據透視表,這些數據透視表為各種目的維護非規范化的數據,例如索引、唯一性、關系等。

Force.com 的數據處理引擎通過透明地批量執行數據修改操作來幫助簡化大型數據負載和在線事物處理應用程序的開銷。這個引擎具有內置的故障恢復機制,該機制可在排除導致錯誤的記錄之后自動重試批量保存操作。

為了進一步提高應用程序的響應時間,該平臺采用了外部搜索服務,該服務可優化全文索引和搜索。隨著應用程序更新數據,搜索服務的后臺進程幾乎實時地異步更新租戶和用戶特定的索引。應用程序引擎和搜索服務之間的這種職責分離使平臺應用程序可以有效地處理事務,而不會增加文本索引更新的開銷,同時可以快速為用戶提供準確的搜索結果。

Force.com 的運行時應用程序生成器可以響應特定用戶的請求,動態構建應用程序,因此,引擎嚴重依賴其「多租戶感知」查詢優化器來盡可能高效地執行內部操作。查詢優化器考慮哪個用戶正在執行給定的應用程序功能,然后使用通用數據字典 (UDD) 中維護的相關特定于租戶的元數據以及內部系統數據透視表,構建并執行作為優化數據庫查詢的數據訪問操作。

現在你對構成 Force.com 的底層機制的關鍵架構組件有了大致了解。以下各章將更詳細地說明各種內部系統元素的結構和構建目的。?

譯注:定義元素到通用數據字典 (UDD),通過「元數據」描述應用程序,實現引擎基于元數據動態生成「租戶特定的虛擬應用程序」。分別針對元數據訪問、大表數據訪問、數據處理、搜索等進行了相應的優化。

6.數據定義和存儲

Force.com 存儲模型不是試圖管理一個龐大的、不斷變化的、代表每個應用和租戶的一組實際的數據庫結構集,而是使用一組元數據、數據和數據透視表來管理「虛擬」數據庫結構,如圖 3 所示。?

b123cf21189b820dfc1ec767d9d10722.png

圖3 Force.com 的數據定義和存儲模型?

當組織創建自定義應用程序對象時,通用數據字典 (UDD) 會跟蹤有關的對象、其字段、關系和其他對象定義特征的元數據。

同時,一些大型數據庫表存儲所有虛擬表的結構化和非結構化數據,還有一組相關的專用數據庫透視表維護非規范化數據,使數據集極其有用。

譯注:在「邏輯上」實現隔離

6.1 對象元數據表

對象元數據表,存儲組織為應用程序定義的自定義對象 (又名,表或者實體)的信息,包括對象的唯一標識符 (ObjID),擁有該對象的組織 (OrgID) 以及為其指定的對象名稱 (ObjName)。

6.2 字段元數據表?

字段元數據表,存儲組織為自定義對象定義的自定義字段 (又名,列或者屬性),包括字段的唯一標識符 (FieldID),擁有該對象的組織 (OrgID),包含該字段的對象 (ObjID),該字段的名稱 (FieldName),該字段的數據類型,標識該字段是否需要索引 (IsIndexed) 的布爾值以及該字段在對象中相對于其他字段的位置 (FieldNum)。

6.3 數據表

數據表存儲應用程序可訪問的數據,該數據映射到所有自定義對象及其字段,這由對象和字段中的元數據定義。每行包括標識字段,例如全局唯一標識符 (GUID),擁有該行的組織 (OrgID) 以及包含對象標識符 (ObjID)。數據表的每行還具有一個名稱字段,該字段存儲相應對象的「自然名」;例如,一個 Account 對象可能會使用「Account Name」,一個 Case 對象,可能會用「Case Name」,等等。Value0,…,Value500 等這些列存儲應用數據,分別映射到對象表和字段表中聲明的對象和字段。所有「flex」列都可以使用可變長度的字符串數據類型,因此它們可以存儲任何結構化類型的應用程序數據 (字符串、數字、日期等)。

自定義字段可以使用多種標準結構化數據類型中的任何一種,例如文本、數字、日期和時間,以及特殊用途的結構化數據類型,如選擇列表 (枚舉字段)、自動編號、公式、主從關系 (外鍵)、復選框 (布爾值)、電子郵件、URL等。自定義字段也可能是必需的,并且有自定義驗證規則 (例如,一個字段必需大于另一個字段),這兩個規則均由平臺的應用服務器強制執行。

當一個組織聲明或者修改一個自定義應用對象,Force.com 將在對象表中管理定義該對象的元數據行。同樣,對于每個自定義字段,Force.com 管理字段表中的一行,包括將字段映射到數據表中特定彈性列的元數據,以存儲相應的字段數據。因為?Force.com?將對象和字段定義作為元數據而不是實際的數據庫結構來管理,所以該平臺可以容忍多租戶應用程序架構的維護活動,而不會阻止其他租戶和用戶的并發活動。

同一對象的兩個字段都不能映射到數據表中的同一 flex 列 (slot) 進行存儲;但是,只要每個字段都來自不同的對象,則單個 flex 列就可以管理多個字段的信息。?

bcb195ca63ee6ffac24a2149668c3462.png

圖4 單個 flex 列

如圖 4 中的數據表的簡化表示所示,flex 列具有通用數據類型(可變長度字符串),這允許 Force.com 在多個字段間共享一個 flex 列,使用各種結構化數據類型 (字符串,數字、日期等)。

Force.com 使用規范格式存儲所有 flex 列數據,當應用程序向 flex 列讀寫數據,必要時可以使用基礎數據庫系統的數據類型轉換功能 (例如TO_NUMBER,TO_DATE,TO_CHAR)。?

6.4 CLOBs 表

Force.com 支持將字段聲明為字符大對象 (CLOB),以允許存儲最多 32,000 個字符的長文本字段。?對于數據表中具有字符大對象 (CLOB) 的每一行,Force.com?將 CLOB 離線存儲在稱為 CLOBs 的數據透視表中,系統可以根據需要將其與數據表中的相應行合并。

6.5 索引數據透視表

傳統的數據庫系統依靠索引來快速定位數據庫表中具有匹配特定條件的字段的特定行。?但是,為數據表的 flex 列創建本機數據庫索引是不切實際的,因為?Force.com?可能使用單個 flex 列來存儲具有不同結構化數據類型的許多字段的數據。?相反,Force.com?通過將標記為建立索引的字段數據同步復制到數據透視表中稱為索引的適當列中,從而管理數據表的索引。

索引表包含強類型化的索引列,例如 StringValue,NumValue 和 DateValue,Force.com 用來查找對應數據類型的字段數據。?例如,Force.com?會將數據表 flex 列中的字符串值復制到索引中的 StringValue 字段,將日期值復制到 DateValue 字段中,等等。索引表的基礎索引是標準的非唯一數據庫索引。?當內部系統查詢包含引用自定義對象中結構化字段的搜索參數時,平臺的查詢優化器將使用索引表來幫助優化關聯的數據訪問操作。

注意:Force.com 可以處理多種語言的搜索,因為該平臺的應用程序服務器使用大小寫折疊算法,該算法將字符串值轉換為不區分大小寫的通用格式。?索引表的 StringValue 列以這種格式存儲字符串值。?在運行時,查詢優化器將自動構建數據訪問操作,以便優化的 SQL 語句根據與搜索請求中提供的文字相對應的大小寫折疊的 StringValue 進行過濾。?

6.6 UniqueFields 數據透視表

Force.com 使組織可以聲明對象中的字段何時必須包含唯一值(區分大小寫或不區分大小寫)。考慮到數據表的排列和「值」列對于自定義字段數據的共享用法,為該表創建唯一的數據庫索引是不切實際的。

為了支持自定義字段的唯一性,Force.com 使用了名為 UniqueFields 的數據透視表。該表與「索引數據透視表」非常相似,不同之處在于 UniqueFields 表的基礎數據庫索引具有唯一性。?當應用程序嘗試在要求唯一性的字段中插入重復值,或者管理員嘗試對包含重復值的現有字段強制執行唯一性時,Force.com?會將適當的錯誤消息傳遞到應用程序。

6.7 關系數據透視表

Force.com 提供了「關系」數據類型,組織可以使用該數據類型來聲明應用程序對象之間的關系 (參照完整性)。當組織使用關系類型聲明對象的字段時,平臺會將該字段映射到數據表中的值字段,然后使用該字段存儲相關對象的 ObjID。

為了優化 join 操作,Force.com 維護一個關系數據透視表。關系索引表具有兩個基礎數據庫唯一的復合索引,這些索引可根據需要在任一方向上高效地遍歷對象。

6.8 附加數據透視表

以下數據透視表還為 Force.com 提供了重要功能:

  • FallbackIndex 表:記錄所有對象的名稱,允許應用程序服務器在 Name 字段上執行 fall-back 搜索,并在平臺的外部搜索引擎過載的情況下返回合理的搜索結果。

  • NameDenorm 表:存儲每個對象實例的 ObjID 和名稱,這使 Force.com 可以執行一個簡單的查詢,檢索每個引用的對象實例的名稱以顯示為超鏈接的一部分。

  • 歷史記錄跟蹤表:存儲有關所有字段更改的信息,這使 Force.com 可以提供審核跟蹤中使用的歷史記錄跟蹤。?

6.9 數據與元數據的分區

所有 Force.com 數據、元數據以及數據透視表結構 (包括基礎數據庫索引) 均使用原生數據庫分區機制由 OrgID (按租戶) 進行物理分區。?數據分區是數據庫系統提供的一種行之有效的技術,可以將大型邏輯數據結構物理上分成較小的,更易于管理的部分。?分區還可以幫助提高大型數據庫系統 (如多租戶環境) 的性能、可伸縮性和可用性。?例如,根據定義,每個?Force.com?應用程序查詢都針對特定租戶的信息,因此查詢優化器只需要考慮訪問包含租戶數據的數據分區,而不是訪問整個表或索引,這種常見的優化有時稱為「partition pruning」。?

譯注:可以看到主要的設計中都會體現租戶標識 (OrgID),在數據和元數據的存儲上也可以基于「物理隔離」。

7.應用開發、邏輯和處理

Force.com 支持兩種不同的方式來創建自定義應用程序及其各個組件:通過使用本機平臺應用程序框架進行聲明式聲明,以及通過使用應用程序編程接口 (API) 以編程方式進行聲明。?

以下各節詳細介紹了每種方法和相關的應用程序開發主題。

7.1 應用框架

開發人員可以使用 Force.com 應用程序框架以聲明方式構建自定義 Force.com 應用程序。?該平臺的原生界面支持應用程序開發過程的所有方面,包括創建應用程序的數據模型 (自定義對象及其字段、關系等)、安全性和共享模型 (用戶、組織層次結構、配置文件等) 、用戶界面 (屏幕布局、數據輸入表單、報表等) 以及邏輯和工作流程。

由于不涉及任何編碼,因此?Force.com?應用程序框架的用戶界面易于構建。?在后臺,它們支持所有常見的數據訪問操作,包括查詢、插入、更新和刪除。

Force.com 的原生集成開發環境 (IDE) 可以輕松訪問許多內置的平臺功能,從而可以輕松實現常見的應用程序功能,而無需編寫復雜且易于出錯的代碼。這些功能包括:

  • 聲明式工作流:由對象實例 (行) 的插入或更新觸發的預定義操作。工作流程可以觸發任務、發送電子郵件告警、更新數據字段或發送消息。

  • 加密/屏蔽的字段:開發人員配置為加密相應數據并使用輸入掩碼隱藏屏幕信息的文本字段。

  • 驗證規則:無需任何編程即可強制執行域完整性規則的規則。

  • 公式字段:Force.com 應用程序框架的聲明式功能,可輕松將計算出的字段添加到對象。

  • 匯總摘要字段:跨對象字段,可輕松在父對象中匯總子字段信息。?

7.2 元數據和 Web Service APIs

Force.com 還提供用于構建應用程序的編程API。?這些 API 與基于 SOAP 的開發環境兼容,包括 Visual Studio .NET (C#) 和 Apache Axis (Java and C++)。

Force.com 元數據 API 可用于管理應用程序組件 - 創建和修改與自定義對象定義、頁面布局、工作流等相對應的元數據。應用程序可以使用?Force.com Web服務 API 創建、檢索、更新或刪除對象實例 (數據行)。

要訪問 Force.com Web服務,開發人員首先下載 Web 服務描述語言 (WSDL) 文件。?然后,在開發平臺使用 WSDL 文件生成API,以訪問組織的相應?Force.com Web服務 (數據模型)。

有兩種類型的 Force.com WSDL 文件。企業 WSDL 文件適用于構建特定于組織的應用程序的開發人員。企業 WSDL 文件是組織數據模型的強類型表示。它為開發環境提供有關組織的架構、數據類型和字段的信息,從而可以使其與?Force.com Web服務進行更緊密的集成。如果將自定義字段或自定義對象添加、重命名或從組織的應用程序架構中刪除,則企業 WSDL 會發生變化。?相反,合作伙伴 WSDL 文件適用于為多個組織開發客戶端應用程序的?Salesforce.com?合作伙伴。?作為?force.com?對象模型的松散表示形式,合作伙伴 WSDL 提供了一個API,可用于訪問任何組織內的數據。?

7.3 通過 API 調用進行批量處理

事務密集型應用程序在合并和執行批量重復操作時產生的開銷較小,并且性能更高。?例如,對比應用程序可以加載對象的許多新實例的兩種方式。?一種低效的方法是使用帶有循環的例程,該例程插入單個對象實例,并為每個插入操作進行一個 API 調用。一種更有效的方法是創建對象實例的數組,并使例程通過單個 API 調用將所有實例插入。

Force.com Web服務 API ,例如create(),update() 和delete() 等支持批量操作。?為了獲得最高效率,該平臺隱式批量處理與顯式批量操作相關的所有內部步驟,如圖5所示。?

abbcdc443f9a9e6fb80adfe93bc6fbe0.png

圖5 Force.com?批量處理引擎

圖5 還顯示了 Force.com 的批量處理引擎如何解決整個過程中任何步驟遇到的孤立故障。?當批量操作以部分保存模式開始時,引擎會識別一個已知的啟動狀態,然后嘗試執行過程中的每個步驟 (批量驗證字段數據,bulk fire pre-triggers,批量保存記錄等)。?如果引擎在任何步驟中都檢測到錯誤,則引擎會回退有害的操作和所有副作用,刪除造成錯誤的行,然后繼續嘗試批量處理其余的行子集。?此過程反復遍歷過程的每個階段,直到引擎可以提交行的子集而沒有任何錯誤。?應用程序可以檢查返回對象,以識別哪些行失敗以及它們引發了哪些異常。

注意:根據應用程序的判斷,批量操作也可以使用全有或全無模式 (all-or-nothing mode)。?同樣,在批量操作期間執行觸發器要受內部工作量的限制。?

7.4 刪除、取消刪除和回收站

當有人從自定義對象中刪除單個對象實例 (記錄) 時,Force.com 只需通過修改對象實例的 IsDeleted 字段 (在數據表中) 將其標記為刪除即可。?這樣可以有效地將對象放置在平臺的回收站中。?Force.com?允許用戶從回收站中查看和還原選定的對象實例長達30天,然后才能將其從內部數據表中永久刪除。?平臺會根據組織的用戶許可證總數來限制其為組織保留的記錄總數。

當某人刪除涉及主從關系的父記錄時,Force.com 會自動刪除所有相關的子記錄,前提是這樣做不會破壞任何完整性規則。?例如,當用戶刪除 SalesOrder 時,Force.com?會自動將刪除級聯到相關的 LineItems。?如果隨后有人從回收站還原了父記錄,則平臺也會自動還原所有子對象實例。

相反,當有人刪除涉及查找關系的引用父記錄時,Force.com 會自動將所有從屬鍵設置為 null。?如果隨后有人還原了父記錄,Force.com?將自動還原以前為空的查找關系,但在刪除和還原操作之間重新分配的關系除外。

回收站還存儲丟棄的字段及其數據,直到組織永久刪除它們或45天過去之后 (以先到者為準)。?在此之前,整個字段及其所有數據都可用于恢復。?

7.5 數據定義處理

某些類型的對象定義修改,不僅僅需要簡單地更新通用數據字典 (UDD) 元數據。在這種情況下,Force.com?使用有效的機制來幫助減少對平臺多租戶應用程序的總體性能影響。

例如,考慮當有人將一列的數據類型從「選擇列表」修改為「文本」時,后臺發生的事情。Force.com?首先為該列的數據分配一個新的 slot,批量復制與當前值關聯的選擇列表標簽,然后更新該列的元數據,使其指向新的 slot。?盡管發生了所有這些情況,但是對數據的訪問是正常的,應用程序繼續運行不會產生任何明顯的影響。

譯注:通過冗余來實現平滑變更。

另一個示例,考慮當某人向表中添加「匯總摘要字段」時會發生什么。?在這種情況下,Force.com?使用高效的批量操作在后臺異步計算初始摘要。?在進行后臺計算時,查看新字段的用戶會收到一個提示,說明?Force.com?正在計算該字段的值。?

7.6 APEX

Apex 是一種強類型的,面向對象的過程編程語言,開發人員可以使用它來聲明程序變量和常量并執行傳統的流控制語句 (if-else,循環等),數據操作操作 (插入、更新、向上插入、刪除),以及代表 Force.com 應用程序的事務控制操作 (setSavepoint,回滾)。開發人員可以構建 Apex 例程,以將自定義業務邏輯添加到大多數應用程序事件中,包括按鈕單擊、數據更新、Web 服務請求、自定義批處理服務等。

Apex 與 Java 類似,是一個不可或缺的 Force.com 組件,可幫助平臺交付可靠的多租戶應用程序。?例如,Force.com 自動驗證 Apex 類中的所有嵌入式 Sforce 對象查詢語言 (SOQL) 和Sforce對象搜索語言 (SOSL) 語句,以防止代碼在運行時失敗。?然后,平臺會為有效的 Apex 類維護相應的對象依賴項信息,并使用此信息來防止對元數據進行更改,否則這些更改會破壞被依賴的應用程序。

為了防止共享的多租戶平臺資源被惡意或無意壟斷,Force.com 具有與 Apex 代碼執行相關的大量調控器和資源限制。例如,Force.com 密切監視 Apex 腳本的執行情況,并限制它可以使用多少 CPU 時間,它可以消耗多少內存,它可以執行多少查詢和 DML 語句等等。平臺優化器認為過于昂貴而無法執行的單個查詢會向調用者拋出運行時異常。盡管這樣的限制聽起來有些限制性,但對于保護所有相關應用程序的共享平臺的總體可伸縮性和性能而言,它們是必需的。從長遠來看,這些措施有助于在平臺開發人員中推廣更好的編碼技術,并為每個人創造更好的體驗。例如,最初嘗試編寫一個循環以低效率地一次更新一千行的循環的開發人員將由于資源限制而收到運行時異常,然后開始使用 Force.com 的高效批量處理 API 調用。

為了進一步避免編寫不當的應用程序引起的潛在平臺問題,新生產應用程序的部署是嚴格管理的過程。?在組織可以將新的自定義應用程序從開發狀態轉換為生產狀態之前,Salesforce.com 需要進行單元測試,以驗證該應用程序的 Apex 例程的功能。?提交的單元測試必須覆蓋不少于應用程序源代碼的75%。Salesforce.com 在 Force.com 沙盒環境中執行提交的單元測試,以確定該應用程序是否會對整個多租戶群體的性能和可伸縮性產生不利影響。?單個單元測試的結果提供基本信息,例如執行的總行數,以及有關測試未執行的代碼的特定信息。

一旦 Salesforce.com 對應用程序進行了生產驗證,則部署過程將由單個事務組成,該事務將所有應用程序的元數據復制到生產 Force.com 實例中并重新運行相應的單元測試。?如果該過程的任何部分失敗,Force.com 只會回滾事務并返回異常以幫助解決問題。

生產應用程序上線后,Force.com 的內置性能分析器會自動分析并向管理員提供相關的反饋。?性能分析報告包括有關慢查詢,數據操作和子例程的信息,開發人員可以查看這些信息并使用它們來調整應用程序功能。?該平臺還記錄有關運行時異常的信息,并將其返回給管理員,以幫助調試其應用程序。?

譯注:資源管控、故障管理、性能分析反饋一個都不能少。

8.內部查詢優化

大多數現代數據庫系統通過采用基于成本的查詢優化器來確定最佳查詢執行計劃,該優化器考慮了有關目標表和索引數據的相關統計信息。但是,常規的基于成本的優化器統計信息是為單租戶應用程序設計的,無法解決在多租戶環境中執行查詢的任何給定用戶的數據訪問特征。?例如,針對具有大量數據的對象 (表) 的給定查詢最有可能針對具有高可見性的用戶 (可以查看所有對象實例的管理者) 與具有低可見性的用戶 (只能看到與自己相關的行的銷售人員) 使用不同的執行計劃來更有效地執行。

為了提供足夠的統計信息來確定多租戶平臺中的最佳查詢執行計劃,Force.com 為每個虛擬多租戶對象維護了一套完整的優化器統計信息 (租戶級、組級和用戶級)。?統計信息反映了特定查詢可能訪問的行數,并仔細考慮了特定于特定租戶的對象統計信息 (租戶整體擁有的總行數等等) 以及更精細的統計信息 (特定的特權組或最終用戶可以訪問等)。

Force.com 還維護其他類型的統計信息,用來證明某些查詢有幫助的。?例如,平臺維護所有自定義索引的統計信息以顯示相應字段中非空值和唯一值的總數,以及維護選擇列表字段的直方圖以顯示每個列表值的基數。

當現有統計數據不存在或不被認為有用時,Force.com 的優化器會使用幾種不同的策略來幫助構建合理的最佳查詢。?例如,當查詢在對象的「名稱」字段上進行過濾時,優化器可以使用 FallbackIndex 數據透視表來有效地找到請求的對象實例。在其他情況下,優化器將在運行時動態生成丟棄的統計信息。

與優化器統計信息一起使用時,Force.com 的優化器還依賴于內部安全相關表 (組、成員、GroupBlowout 和 CustomShare),這些表維護有關平臺用戶安全域的信息,包括指定用戶的組和自定義對象訪問權限。?

31c6c188677ba50fc052bfcf4b3e4b88.png

圖6 Force.com?數據查詢過程?

圖6中的流程圖說明了 Force.com 截取數據請求時發生的情況,比如在一個大堆表 (例如數據表) 中的數據請求。?該請求可能來自許多來源,例如來自應用框架的應用程序的頁面請求,Web服務 API 調用或 Apex 腳本。?首先,平臺執行考慮多租戶感知統計信息的「預查詢」。?然后,考慮預查詢返回的結果,平臺將構建一個最佳數據庫查詢以在特定設置中執行。?

76020cff8abad2dc0450af183bc4efc1.png

表1 Force.com?根據預查詢的結果為數據訪問請求構建數據庫查詢?

如表1所示,Force.com 可以通過四種不同的方式執行相同的查詢,具體取決于提交查詢的人和的選擇的查詢過濾條件。

9.全文檢索引擎

基于Web的應用程序的用戶期望交互式搜索功能可以掃描應用程序的數據,以及最新排名結果秒級反饋。為了為平臺應用程序提供這種強大的功能,Force.com 使用基于外部搜索引擎的架構。

當應用程序更新文本字段 (CLOB、名稱等) 中的數據時,索引服務器池將異步更新相應的索引,搜索引擎將其維護在核心數據庫之外。為了優化索引過程,Force.com 在事務提交時將修改后的文本數據塊同步復制到內部「待索引」表中,從而提供了一個相對較小的數據源,該數據源最大程度地減少了索引服務器必須從中讀取的數據量磁盤。搜索引擎自動為每個租戶維護單獨的索引。

根據索引服務器的當前負載和利用率,文本索引更新可能會明顯滯后于實際事務。為了避免源自過時索引的意外搜索結果,Force.com 還維護了平臺應用程序服務器在實現全文搜索結果時考慮的最近更新對象的 MRU 緩存。該平臺在每個用戶和每個組織的基礎上維護 MRU 緩存,以有效地支持可能的搜索范圍。

Force.com 使用幾種不同的方法來優化搜索結果中記錄的排名。例如,系統考慮執行搜索的用戶的安全域,并權衡當前用戶有權訪問的那些對象。該系統可以將比較活躍的更新對象排在相對靜態的對象之前。用戶可以選擇根據需要對搜索結果進行加權,例如,將重點放在最近修改的對象上。

譯注:使用外部搜索引擎,更新數據的時候冗余數據用于「索引」,縮小范圍;為每個租戶維護單獨索引,考慮租戶的權限范圍,實現隔離和提升性能。

10.結論

平臺即服務 (PaaS) 和軟件即服務 (SaaS) 是當代的軟件應用程序開發和交付模型,越來越多的組織正在使用這種模型來縮短產品上市時間,減少資本支出并提高在具有挑戰性的全球經濟中的整體競爭力。基于互聯網的共享計算平臺之所以具有吸引力,是因為它們使企業能夠按需快速訪問托管的、被管理的軟件資產,并且避免了在本地數據中心模式下相關的購買、安裝、配置和持續維護相關的成本和復雜性。

按需 SaaS/PaaS 最成功的公司是 salesforce.com。該公司開發了 Force.com 平臺,該平臺的元數據驅動架構使任何人都可以有效地構建和交付復雜的、可定制的、關鍵任務的、互聯網規模擴展的多租戶應用程序。使用基于標準的Web、服務 API和原生平臺開發工具,Force.com 開發者能夠輕松構建基于 Web 的應用程序的所有組件,包括數據模型、用戶界面、業務邏輯,與其他應用程序集成等。

在過去的十年中,salesforce.com 工程師針對多租戶優化了 Force.com 平臺的所有層,其功能使該平臺能夠提供前所未有的因特網可擴展性,每天高達 1.7 億個事務。諸如批量數據處理 API、Apex 編程語言、外部全文搜索引擎及其獨特的查詢優化器之類的平臺功能可幫助多租戶平臺的應用程序變得高效、可擴展,而開發人員幾乎無需考慮。

Salesforce.com 用于生產應用程序部署的托管方法,可確保所有相關應用程序具有一流的性能、可伸縮性和可靠性。此外,salesforce.com 持續監控和收集來自 Force.com 應用程序的操作信息,以幫助推動增量改進和新的平臺功能,這些功能將立即使現有和新應用程序受益。?

---本文完---

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

富文本

View Code轉載于:https://www.cnblogs.com/baidaye/p/5295448.html

Jenkins持續集成——用戶管理

一、基于安全矩陣系統管理 —>Configure Global Security相關權限的作用:其中有一些比較特別的權限:最大的權限是Overall的Administer,擁有該權限可以做任何事情。最基本的權限是Overall的Read,用戶必須賦予閱讀的權限&#xf…

pythonui教學視頻_分享軟件開發相關視頻教程(Java、C++、Python、UI設計、HTML5、iOS)...

以下是我收藏的關于開發及其他教程,基本都是花錢在網上買的,網盤沒有加密的,雖然特別愛學習,但并不可能有這么多的精力學習這么多,技術總是很快就被新的淘汰掉,放在網盤中確實太浪費呀,分享出去…

JAVA Set接口和其常用子類HashSet集合

Set接口,它里面的集合,所存儲的元素就是不重復的。 HashSet集合,采用哈希表結構存儲數據,保證元素唯一性的方式依賴于:hashCode()與equals()方法。 保證HashSet集合元素的唯一,其實就是根據對象的hashCode和…

python初始化函數_當你學會了Python爬蟲,網上的圖片素材就免費了

前言本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。加入作者的python學習圈子:1156465813 即可免費獲取,資料全在群文件里。資料可以領取包括不限于Python實戰演練、PDF電子文檔…

第三周作業(一)單元測試

下載vs2015安裝包,打開進行安裝. 選擇顏色 安裝完成,需要登錄 啟動vs 單元測試 1.打開vs界面。 2.新建項目。選擇Visual C# 創建類庫。 3.點擊確定后,進入代碼編輯界面。 4.根據書中代碼,寫入程序,并進行測試。 轉載于…

React-Native-lesson

React-Native-lesson 一、React-Native入門指南 lesson2: 認識代碼結構lesson4: 學會React-Native布局(一)lesson6: UI組件lesson8: 自己動手寫組件 https://github.com/vczero/toilet React Native完全開發的獨立App,支持ES6語法&#xff0c…

1、如何進行字符串常量中的字符定位_Java String:字符串常量池,我相信會有很多朋友不很理解這部分...

作為最基礎的引用數據類型,Java 設計者為 String 提供了字符串常量池以提高其性能,那么字符串常量池的具體原理是什么,我們帶著以下三個問題,去理解字符串常量池:字符串常量池的設計意圖是什么?字符串常量池…

Egret中使用P2物理引擎

游戲中的對象按照物理規律移動,體現重力、引力、反作用力、加速度等物體特性,實現自由落體、搖擺運動、拋物線運動,以及物理碰撞現象的模擬。用于模擬物理碰撞、物理運動的引擎稱為物理引擎。 來自瑞典斯德哥爾摩大學的Stefan Hedman基于Java…

react項目_如何從零開始創建React項目(三種方式)

在開發React項目前最關鍵的當然是項目的創建,現在的前端工程化使得前端項目的創建也變得越來越復雜,在這里介紹三種從零開始創建React項目的方式,分別是在瀏覽器中直接引入、使用官方腳手架create-react-app、使用Webpack創建。瀏覽器中通過標…

利用JSONP解決AJAX跨域問題的原理與jQuery解決方案

寫在前面 跨域的解決方案有多種,其中最常見的是使用同一服務器下的代理來獲取遠端數據,再通過ajax進行讀取,而在這期間經過了兩次請求過程,使得獲取數據的效率大大降低,這篇文章藍飛就為大家介紹一下解決跨域問題的一種…

江西理工大學南昌校區cool code競賽

這次比賽原本就是來打醬油的,想做個簽到題就走!一開始不知道1002是簽到題,一直死磕1001,WA了四發過了,回頭一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一個人AC…

mysql 枚舉_詳解MySQL數據類型之枚舉類型ENUM的用法

本節主要內容:MySQL數據類型之枚舉類型ENUMMySQL數據庫提供針對字符串存儲的一種特殊數據類型:枚舉類型ENUM,這種數據類型可以給予我們更多提高性能、降低存儲容量和降低程序代碼理解的技巧,前面介紹了首先介紹了四種數據類型的特…

# 異運算_小學數學運算三要點:定律、法則與順序(解析)

很多孩子的數學不好,尤其是女孩子。家長往往認定為數學不好就是孩子不擅長,能力差。其實未必,有的孩子數學不好的原因并不在于智商,而是沒有理解到數學的方法與邏輯,比如小學的運算中,很多孩子并沒有了解到…

如何實現一個教師與學生教學輔助平臺?

在軟件工程的學習過程中,我們要完成一個團體項目,關于個人教學輔助系統,對于這個,還有太多要學。對于如何實現其中的功能,我們會利用到html,css等語言來編寫網頁前端,同樣也會用到數據庫的知識。…

證明創建runnable實例和普通類時間一樣長

import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;//證明創建runnable實例和普通類時間一樣長public class Test002 { private Concurre…

mysql數據庫維護_維護MySQL數據庫表

在本教程中,我們將向您介紹一些非常有用的語句,使您可以在MySQL中維護數據庫表。MySQL提供了幾個有用的語句,可以有效地維護數據庫表。 這些語句使您能夠分析,優化,檢查和修復數據庫表。分析表語句MySQL查詢優化器是My…

node-glob 正則表達式

https://github.com/isaacs/node-glob轉載于:https://www.cnblogs.com/chris-oil/p/6507368.html

機器學習筆記—再談廣義線性模型

前文從線性回歸和 Logistic 回歸引出廣義線性回歸的概念,很多人還是很困惑,不知道為什么突然來個廣義線性回歸,有什么用?只要知道連續值預測就用線性回歸、離散值預測就用 Logistic 回歸不就行了?還有一些概念之間的關…

python連接access數據庫odbc_對Python通過pypyodbc訪問Access數據庫的方法詳解

看書上通過ODBC訪問數據庫的案例,想實踐一下在Python 3.6.1中實現access2003數據庫的鏈接,但是在導入odbc模塊的時候出現了問題,后來查了一些資料就嘗試著使用pypyodbc,最后成功了。操作步驟:①安裝pypyodbc目前Python…