讀書筆記《互聯(lián)時(shí)代的軟件革命-SaaS架構(gòu)設(shè)計(jì)》葉偉(二)
第一章
1.什么是SaaS
2.SaaS和ASP的區(qū)別
Application Service Provider(應(yīng)用服務(wù)提供商),ASP模式就是將軟件統(tǒng)一托管到應(yīng)用服務(wù)提供商的服務(wù)器中。SaaS,Software as a Service軟件即服務(wù)就是SaaS,SaaS的目標(biāo)是軟件的徹底服務(wù)化。``
3.SaaS的優(yōu)勢(shì)和不足
優(yōu)勢(shì):開(kāi)通簡(jiǎn)單、無(wú)需維護(hù)、按需購(gòu)買使用、不受時(shí)間空間限制、風(fēng)險(xiǎn)低、投入小、試錯(cuò)成本低
不足:依賴互聯(lián)網(wǎng)、數(shù)據(jù)安全性和保密性有可能會(huì)泄漏。
第二章 SaaS 成熟度模型
- SaaS的規(guī)模效應(yīng)
在傳統(tǒng)軟件方式下,一個(gè)租戶需要購(gòu)買一套軟件及硬件、網(wǎng)絡(luò)和人員的投入。SaaS模式下,租戶只需要購(gòu)買一套軟件服務(wù)即可,其它都是軟件提供商的投入成本,用戶不需要考慮。對(duì)于具備良好可擴(kuò)展性的SaaS系統(tǒng),通過(guò)用戶數(shù)量的擴(kuò)大,本均成本就越低。這就是SaaS系統(tǒng)的規(guī)模效應(yīng)。
在Multi-Tenant架構(gòu),多租戶架構(gòu)。
- SaaS成熟度模型

Level 1 定制開(kāi)發(fā)
就按照客戶的需,求來(lái)定制一個(gè)版本,每個(gè)客戶的軟件都有一份獨(dú)立的代碼。
Level 2 可配置
每個(gè)客戶獨(dú)立部署一個(gè)運(yùn)行實(shí)例。只是每個(gè)運(yùn)行實(shí)例運(yùn)行的是同一份代碼,通過(guò)配置的不同來(lái)滿足不同客戶的個(gè)性化需求。
Level 3 多租戶架構(gòu)
Level 4 可伸縮的多租戶架構(gòu)
將多用戶的訪問(wèn)需求通過(guò)負(fù)載平衡層分配到不同的實(shí)例上,實(shí)現(xiàn)幾乎無(wú)限制水平擴(kuò)展。
SaaS系統(tǒng)特別可配置性、高性能、可伸縮性。
定制開(kāi)發(fā)
可配置
多用戶架構(gòu):
Multi-Tenant架構(gòu):多用戶架構(gòu)是實(shí)現(xiàn)SaaS的基礎(chǔ)要求
多用戶下的可伸縮性:優(yōu)化系統(tǒng)的性能。
可配置:抓住客戶主要需求,實(shí)現(xiàn)功能可配置。
可伸縮性:包括應(yīng)用層可伸縮和數(shù)據(jù)庫(kù)層可伸縮。
第三章 視圖
邏輯視圖,如果設(shè)計(jì)采用面向?qū)ο蟮姆椒ǎ壿嬕晥D就是對(duì)象模型。邏輯視圖重點(diǎn)在于功能,包括業(yè)務(wù)功能和系統(tǒng)功能。以及邏輯分層、模塊劃分和模塊之間的關(guān)系。
開(kāi)發(fā)視圖,描述軟件在開(kāi)發(fā)環(huán)境下的靜態(tài)組織。開(kāi)發(fā)視圖關(guān)注程序包,應(yīng)用的統(tǒng)一框架,引用的類庫(kù)、SDK和中間件,以及工程和包的劃分規(guī)則等,規(guī)范、約束開(kāi)發(fā)環(huán)境的結(jié)構(gòu)。
過(guò)程視圖,流程,描述系統(tǒng)的并發(fā)和同步等設(shè)計(jì)。視業(yè)務(wù)場(chǎng)景可省略。
場(chǎng)景視圖(業(yè)務(wù)場(chǎng)景),也叫用例視圖,描述用戶的業(yè)務(wù)場(chǎng)景和復(fù)雜度可省略。
物理視圖,也叫部署視圖,描述軟件如何映射到硬件,反映系統(tǒng)在分布/部署上的設(shè)計(jì)。物理視圖需要解決最終如何安裝和部署到服務(wù)器,以及網(wǎng)絡(luò)分布的問(wèn)題。
Multi-Tenant在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案
- 獨(dú)立數(shù)據(jù)庫(kù),一個(gè)Tenant一個(gè)Database
- 共享數(shù)據(jù)庫(kù),隔離數(shù)據(jù)架構(gòu)。即多個(gè)或所有租戶共享Database,但一個(gè)Tenant一個(gè)Schema(表)。
共享數(shù)據(jù)庫(kù),共享數(shù)據(jù)架構(gòu)。即租戶共享同一個(gè)Database、同一個(gè)Schema(表),但在表中通過(guò),TenantID(租戶ID)區(qū)分租戶的數(shù)據(jù)。
圖片2.png
SaaS成熟度模型不同等級(jí)的不同特點(diǎn):
Level 1:設(shè)備托管;
Level 2:設(shè)備共享、可配置化;
Level 3:多租戶、數(shù)據(jù)隔離、高性能。
第4章 高性能的Multi-Tenant的最佳方案
1. 數(shù)據(jù)庫(kù)的優(yōu)化
1) 建立索引 2)消除大數(shù)據(jù)表連接 3)避免復(fù)雜SQL

2. 應(yīng)用層的優(yōu)化
1)Cache優(yōu)化:將常用到的用戶數(shù)據(jù)、權(quán)限數(shù)據(jù)放到Cache中,
實(shí)施方法:可以考慮在系統(tǒng)啟動(dòng)時(shí)即載入Cache,在發(fā)生變化的時(shí)候,更新Cache。角色則應(yīng)該在用戶登錄的時(shí)候,獲取用戶的角色信息,并放入用戶Session中。如果cache訪問(wèn)失敗,則訪問(wèn)數(shù)據(jù)庫(kù),并重新將其載入Cache中。
2)統(tǒng)計(jì)和報(bào)表計(jì)算
(1)對(duì)實(shí)時(shí)性要求不高的,制作定時(shí)任務(wù)計(jì)算。
⑵歷史數(shù)據(jù)可修改的,對(duì)于修改的歷史數(shù)據(jù),重新計(jì)算。
⑶對(duì)于實(shí)時(shí)性要求高的,在原定時(shí)任務(wù)基礎(chǔ)上增加增量的計(jì)算。
3)基礎(chǔ)Tenant的索引搜索
利用開(kāi)源搜索引擎
4)異步操作
- 表現(xiàn)層異步
- 后臺(tái)業(yè)務(wù)邏輯異步
3. Web層的性能優(yōu)化
1 內(nèi)容類:減少http請(qǐng)求數(shù)、減少DNS查找、避免無(wú)效的跳轉(zhuǎn)、緩存ajax等
2 服務(wù)器業(yè)與Cookie類:使用CDN、Gzip壓縮網(wǎng)頁(yè)、配置實(shí)體標(biāo)簽、減少cookie體積等。
3 Javascript、CSS、圖片類:把腳本置于頁(yè)面底部、使用外部jS 和CSS、減少不必要的JS和CSS等。
4 移動(dòng)應(yīng)用類:保持單個(gè)內(nèi)容小于25K、打包組件成復(fù)合文本
- 性能監(jiān)控
第五章 多用戶應(yīng)用的可配置性
一、數(shù)據(jù)可配置
- 定制字段
根據(jù)客戶的需求在數(shù)據(jù)表上增加相應(yīng)的定制字段來(lái)保存擴(kuò)展數(shù)據(jù)。- 預(yù)分配字段
預(yù)分配字段是指在用戶可能有擴(kuò)展需求的表中預(yù)設(shè)一定數(shù)量的字段。當(dāng)用戶提出擴(kuò)展需求時(shí),使用其中的一個(gè)或多個(gè)字段來(lái)保存擴(kuò)展數(shù)據(jù)。- 名稱值對(duì)
慮將擴(kuò)展數(shù)據(jù)的保存與原數(shù)據(jù)表分離,另外用一張統(tǒng)一的擴(kuò)展數(shù)據(jù)表來(lái)保存。
三種方案優(yōu)勢(shì)比較

二、功能可配置
實(shí)施流程
- 原子功能劃分
拆分原則:每一個(gè)原子功能都要能夠給用戶帶來(lái)某方面的價(jià)值。在保證原子功能對(duì)于用戶有價(jià)值的前提下,功能分解要盡量細(xì)化,直到不能再細(xì)分為止。
- 功能包設(shè)計(jì)
是根據(jù)用戶的類型和使用的場(chǎng)景,對(duì)原子功能進(jìn)行打包,然后為每一個(gè)用戶挑選其合適的功能包。功能包的設(shè)計(jì)要遵循高內(nèi)聚、低耦合的原則。
三、界面可配置
- 系統(tǒng)菜單可配置
主要是指不同的租戶可以同時(shí)購(gòu)買和使用系統(tǒng)內(nèi)不同的功能集合。
- 頁(yè)面元素可配置
各功能頁(yè)面上的內(nèi)容也是供用戶與系統(tǒng)交互的界面元素。無(wú)論是對(duì)頁(yè)面元素的個(gè)數(shù)、位置、順序,還是元素的含義,租戶都可能會(huì)有一些個(gè)性化的需求。
四、流程可配置
在流程可配置方面,SaaS應(yīng)用與傳統(tǒng)應(yīng)用在本質(zhì)上并沒(méi)有太大的區(qū)別。只是在多租戶的SaaS應(yīng)用中,租戶之間的流程和數(shù)據(jù)是要隔離的。除了應(yīng)用預(yù)置的流程模板以外,其他的都是由租戶自己來(lái)定義和設(shè)計(jì)的。
五、配置元數(shù)據(jù)管理
1.對(duì)同一種類的多項(xiàng)配置可以進(jìn)行統(tǒng)一實(shí)現(xiàn)。即脫離業(yè)務(wù)邏輯實(shí)現(xiàn)統(tǒng)一公共的數(shù)據(jù)可配置、功能可配置、界面可配置和流程可配置。
將數(shù)據(jù)可配置、功能可配置、界面可配置、流程可配置的配置參數(shù)進(jìn)行抽象,對(duì)于系統(tǒng)內(nèi)可配置的擴(kuò)展點(diǎn),以及租戶基于這些擴(kuò)展點(diǎn)進(jìn)行配置的內(nèi)容進(jìn)行統(tǒng)一的管理。
SaaS應(yīng)用中要管理的可配置參數(shù)包括以下幾種:表、原子功能、功能包、菜單、頁(yè)面、頁(yè)面元素、流程等。對(duì)于以上配置類型稱之為配置元。
配置元之間存在三種關(guān)系類型:包含、依賴、關(guān)聯(lián)。根據(jù)上面的抽象,可以得到配置元模型。
- 租戶配置數(shù)據(jù)
租戶配置數(shù)據(jù),是指基于配置元模型和配置元數(shù)據(jù),由租戶管理員根據(jù)租戶的需要來(lái)定義相應(yīng)的配置信息。
3.配置元數(shù)據(jù)服務(wù)
通過(guò)配置元數(shù)據(jù)管理將系統(tǒng)內(nèi)可以配置的元素,租戶配置數(shù)據(jù)管理將相應(yīng)的配置數(shù)據(jù)定義出來(lái)。配置元數(shù)據(jù)服務(wù),就是要提供一套統(tǒng)一操作這些元數(shù)據(jù)的服務(wù)接口,以及一套可以直接使用元數(shù)據(jù)的控件,供業(yè)務(wù)模塊開(kāi)發(fā)時(shí)使用。
六、可配置系統(tǒng)運(yùn)行
有關(guān)各類配置數(shù)據(jù)的使用邏輯及調(diào)度控制,通過(guò)3個(gè)特殊的引擎來(lái)完成。
1.工作流引擎:流程可配置數(shù)據(jù)的使用與控制。
2.擴(kuò)展數(shù)據(jù)引擎:有關(guān)擴(kuò)展數(shù)據(jù)的查詢、使用、提交及相應(yīng)的檢查等,
3.功能引擎:負(fù)責(zé)系統(tǒng)內(nèi)功能的調(diào)度和租戶對(duì)功能的使用。
系統(tǒng)菜單框架:系統(tǒng)菜單框架需要依賴功能引擎來(lái)裝載租戶菜單所對(duì)應(yīng)的功能。在菜單被單擊使用的時(shí)候,需要通過(guò)功能引擎來(lái)實(shí)現(xiàn)對(duì)原子功能的調(diào)度和使用。
功能頁(yè)面容器
功能頁(yè)面容器主要解決頁(yè)面要素展示、頁(yè)面功能可用性控制、可配置數(shù)據(jù)展示、可配置數(shù)據(jù)提交4個(gè)方面的問(wèn)題。
1)頁(yè)面要素展示就是要根據(jù)系統(tǒng)頁(yè)面的設(shè)計(jì)和租戶的配置,來(lái)展示頁(yè)面上的各種展示要素。如文字、圖片、音視頻。
2)頁(yè)面功能可用性控制,就是根據(jù)租戶購(gòu)買的原子功能列表,來(lái)確定頁(yè)面內(nèi)的功能是否可用。如:通話功能、直播發(fā)言功能。
3)可配置數(shù)據(jù)展示,就是根據(jù)租戶針對(duì)頁(yè)面實(shí)體定義可配置數(shù)據(jù)列表,在頁(yè)面內(nèi)自動(dòng)展示。如:數(shù)據(jù)列。
4)可配置數(shù)據(jù)提交,就是根據(jù)租戶針對(duì)頁(yè)面實(shí)體設(shè)計(jì)的可配置數(shù)據(jù)項(xiàng),當(dāng)頁(yè)面提交時(shí)從界面上收集可配置項(xiàng)的數(shù)據(jù)內(nèi)容,與數(shù)據(jù)實(shí)體一并提交。如:數(shù)據(jù)列可修改保存。
- 擴(kuò)展數(shù)據(jù)引擎
數(shù)據(jù)可配置性的實(shí)現(xiàn),主要包括擴(kuò)展數(shù)據(jù)的展示、擴(kuò)展數(shù)據(jù)的提交、擴(kuò)展數(shù)據(jù)的校驗(yàn)與保存。
- 功能引擎
功能引擎,就是要根據(jù)租戶所購(gòu)買的功能包,來(lái)查找租戶所有的“可用原子功能”集合,結(jié)合其購(gòu)買的期限,來(lái)確定當(dāng)前租戶是否可執(zhí)行相應(yīng)的功能或操作,以及實(shí)現(xiàn)對(duì)相應(yīng)原子功能的調(diào)度。
