這篇文章本來(lái)是我們開(kāi)發(fā)組內(nèi)部用的一個(gè)小文檔。因?yàn)槲覀児疽郧皼](méi)有做SAAS的經(jīng)驗(yàn),就成立了一個(gè)小組做一做這方面的技術(shù)前探,我是成員之一。這篇文檔想從宏觀的層面把開(kāi)發(fā)一個(gè)SAAS應(yīng)用所要用到的技術(shù)點(diǎn)稍微梳理一下,便于指導(dǎo)后面的技術(shù)前探工作。之所以發(fā)在這里,是因?yàn)樽约合嚓P(guān)的研發(fā)經(jīng)驗(yàn)太缺乏,可能有些技術(shù)盲點(diǎn)是自己根本沒(méi)能考慮到的,希望園子里的各位大牛多多指導(dǎo)。
一.聚焦“三頭怪”
在MS的官方文檔中,把構(gòu)建一個(gè)足夠成熟的SAAS(MS簡(jiǎn)單列出了SAAS應(yīng)用的4級(jí)成熟度)所面臨的3個(gè)主要挑戰(zhàn):可配置性,可擴(kuò)展性,多用戶(hù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)稱(chēng)為“three headed monster”。在MS給出的兩個(gè)SAAS的demo(分別為L(zhǎng)itwareHR和Crab)中,著重解決的也是這三個(gè)問(wèn)題。所以,我們?cè)谶M(jìn)行技術(shù)前探的時(shí)候,也要扣準(zhǔn)這三條主線(xiàn)。
1.概念
SAAS是一個(gè)典型的“單實(shí)例多處應(yīng)用”的軟件類(lèi)型,這就要求實(shí)例本身在不同的應(yīng)用環(huán)境下有很強(qiáng)的配置能力。具體說(shuō)來(lái),需要對(duì)以下4個(gè)方面提供配置能力:
(1)程序的外觀。
(2)工作流程與業(yè)務(wù)規(guī)則。
(3)數(shù)據(jù)模型。
(4)用戶(hù)及最終用戶(hù)的存取權(quán)限。
這種自定義的能力應(yīng)該在易配置性和配置能力兩個(gè)方面做好權(quán)衡,最優(yōu)的結(jié)果當(dāng)然是通過(guò)最方便的配置手段來(lái)實(shí)現(xiàn)最復(fù)雜的自定義功能,但這并不容易做到,所以有可能我們會(huì)需要為一些比較高級(jí)的用戶(hù)提供基于已有系統(tǒng)的二次開(kāi)發(fā)能力(使用腳本等)。下面我們就具體來(lái)談一下關(guān)于可配置性的各個(gè)方面。
2.配置的實(shí)現(xiàn)基礎(chǔ):元數(shù)據(jù)(MetaData)
系統(tǒng)通過(guò)配置數(shù)據(jù)展現(xiàn)不同的外觀和行為,那么對(duì)整個(gè)系統(tǒng)來(lái)說(shuō),配置數(shù)據(jù)就是系統(tǒng)中的元數(shù)據(jù)。筆者自己也沒(méi)有特別研究過(guò)元數(shù)據(jù),僅僅是開(kāi)發(fā)中用過(guò)一些xml文件或者數(shù)據(jù)庫(kù)中的特定表來(lái)保存一些配置信息,但對(duì)于一個(gè)成熟的SAAS應(yīng)用,這種簡(jiǎn)單的配置方式可能是不夠的。如何設(shè)計(jì)出結(jié)構(gòu)靈活、功能強(qiáng)大、兼容性好的元數(shù)據(jù)結(jié)構(gòu),如何在代碼中提供最有效率的元數(shù)據(jù)服務(wù)(Metadata Service),如何定義元數(shù)據(jù)的元數(shù)據(jù)(Metadata of metadata),如何保證在元數(shù)據(jù)結(jié)構(gòu)發(fā)生變化的時(shí)候不影響程序的運(yùn)行,這一切都需要我們?cè)趯?duì)元數(shù)據(jù)本身的語(yǔ)義特性和可能的技術(shù)支持手段進(jìn)行過(guò)調(diào)研之后才能得出。另外,筆者在寫(xiě)這篇文章的時(shí)候,很偶然在網(wǎng)上找到了幾幅關(guān)于元數(shù)據(jù)服務(wù)層設(shè)計(jì)的圖片,很有意思:
上面這幅圖的上半部分給出了SAAS參考體系結(jié)構(gòu)的一個(gè)概念模型,下半部分則給出了對(duì)應(yīng)于體系結(jié)構(gòu)的每一部分,現(xiàn)有的可能采取的技術(shù)手段。我們注意到,元數(shù)據(jù)服務(wù)和元數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)定義是里面唯一的盲區(qū)。
下面這個(gè)圖是Matias Woloski給出的對(duì)各主要配置模塊(界面、業(yè)務(wù)規(guī)則、多用戶(hù)數(shù)據(jù)結(jié)構(gòu)、訪問(wèn)控制)提供的元數(shù)據(jù)服務(wù)的可能解決方案,也許可以做為我們進(jìn)一步深入的一個(gè)線(xiàn)索。
3.配置的需求基礎(chǔ):業(yè)務(wù)共性提取與業(yè)務(wù)個(gè)性分析
為什么是所有tenant共享一套代碼?因?yàn)樗羞@些用戶(hù)在軟件需求上有共同的需要,在業(yè)務(wù)流程上有很多共通的地方,他們所有的應(yīng)用都是在一個(gè)比較確定的業(yè)務(wù)領(lǐng)域(Business Domain)內(nèi)展開(kāi)的。我們需要把這個(gè)業(yè)務(wù)領(lǐng)域內(nèi)的業(yè)務(wù)需求梳理清楚,然后提供我們的軟件為這個(gè)業(yè)務(wù)領(lǐng)域服務(wù)。既然他們都屬于一個(gè)業(yè)務(wù)領(lǐng)域,那么我們提供一套可以運(yùn)行的軟件就行了,為什么還要提供那么強(qiáng)的配置能力呢?因?yàn)橥瑢儆谝粋€(gè)業(yè)務(wù)領(lǐng)域內(nèi)的客戶(hù),他們?cè)跇I(yè)務(wù)規(guī)則的細(xì)節(jié)上其實(shí)有很多不同,業(yè)務(wù)流完全相同的兩個(gè)企業(yè)其實(shí)是不存在的。另外,每一個(gè)企業(yè)都在不停的發(fā)展變化,業(yè)務(wù)結(jié)構(gòu)也都在不斷的調(diào)整、重整、升級(jí)過(guò)程中,我們的軟件應(yīng)該可以在一定的彈性范圍內(nèi),支持企業(yè)的這種升級(jí)。
所以,研究我們的SAAS軟件所要解決的業(yè)務(wù)領(lǐng)域特點(diǎn),找出這個(gè)領(lǐng)域目前在橫向范圍內(nèi)的企業(yè)業(yè)務(wù)間的差異性,以及在可以預(yù)見(jiàn)的將來(lái)的業(yè)務(wù)升級(jí)要求,其實(shí)是實(shí)現(xiàn)SAAS軟件最開(kāi)始的、也是最難的一步。但這一步驟本身和技術(shù)的關(guān)系可能并沒(méi)有那么大,所涉及的最多也能也就是包含UML在內(nèi)的眾多領(lǐng)域建模技術(shù)。這一部分應(yīng)該屬于SAAS研究中業(yè)務(wù)和技術(shù)結(jié)合、同時(shí)業(yè)務(wù)占據(jù)的比重更大的一部分內(nèi)容。
4.配置主要內(nèi)容1:程序外觀的配置
外觀的配置其實(shí)包括的內(nèi)容很多,但比較核心內(nèi)容筆者認(rèn)為是界面元素的多粒度模塊化,只有實(shí)現(xiàn)了這一點(diǎn),才有可能讓用戶(hù)在多個(gè)粒度級(jí)別上去定義自己想顯示什么、以什么樣的界面風(fēng)格去顯示。這一點(diǎn)上也一直是筆者認(rèn)為.Net比較有優(yōu)勢(shì)的地方,因?yàn)镸S的產(chǎn)品一直在構(gòu)件化上面表現(xiàn)不俗。僅就Asp.net2.0中,已經(jīng)有Custom Control,User Control,Web Parts,Theme, Skin, MasterPage等成熟界面技術(shù)可以使用;在.Net3.0的WPF(現(xiàn)已更名為SilverLight)中,相信更有很多優(yōu)秀的模塊化界面技術(shù)的出現(xiàn),筆者尚未研究過(guò)。這些都需要我們?nèi)W(xué)習(xí)和發(fā)現(xiàn)。
另外,如果我們繼續(xù)采用基于瀏覽器的軟件系統(tǒng),Web程序的“體驗(yàn)本地化”是必不可少的工作,在這方面AJAX技術(shù)已經(jīng)越來(lái)越成熟,MS的AJAX 1.0正式版已經(jīng)發(fā)布。
我們?cè)趯W(xué)習(xí)這些界面技術(shù)的時(shí)候,不僅要學(xué)習(xí)它們的使用方式,還要明白它們底層的編譯模型和運(yùn)行模型,這樣我們才能對(duì)每個(gè)顯示模塊對(duì)象實(shí)例如何以最小的運(yùn)行成本來(lái)完成盡可能多的界面顯示和交互響應(yīng)功能有充分的把握。
5.配置主要內(nèi)容2:業(yè)務(wù)流程的配置
所謂業(yè)務(wù)流程,不知筆者的理解是否正確,其實(shí)應(yīng)該屬于經(jīng)典的工作流(workflow)問(wèn)題。所以這一方面盡管非常重要與復(fù)雜,但研究起來(lái)重點(diǎn)卻最為突出,無(wú)非就是兩個(gè):
(1)對(duì)工作流方法論的研究。筆者沒(méi)作過(guò)關(guān)于工作流的開(kāi)發(fā)項(xiàng)目,在這方面暫時(shí)沒(méi)有發(fā)言權(quán),但筆者認(rèn)為在利用工作流相關(guān)的工具和類(lèi)庫(kù)進(jìn)行開(kāi)發(fā)之前,應(yīng)當(dāng)在方法論上對(duì)工作流有一個(gè)比較有度的把握。
(2)對(duì)各種現(xiàn)存的工作流工具的研究。工作流是企業(yè)開(kāi)發(fā)的重點(diǎn),相關(guān)的產(chǎn)品應(yīng)該不少,筆者知道的主要工具如下:
a.WF(Microsoft Workflow Foundation), 這是.Net3.0新增的三大類(lèi)庫(kù)之一,專(zhuān)門(mén)用于對(duì)工作流技術(shù)的支持。
b.BPEL(Business Process Execution Language),這是由IBM牽頭搞的一個(gè)利用XML來(lái)描述業(yè)務(wù)過(guò)程行為的標(biāo)準(zhǔn),目前在業(yè)界也得到了廣泛的支持和應(yīng)用。當(dāng)然,BPEL并不完全等同于工作流,它對(duì)人、角色、工作項(xiàng)目等并沒(méi)有明確定義,重在刻畫(huà)一個(gè)基于Web服務(wù)的業(yè)務(wù)流程。
6.配置手段的易用性
一個(gè)被廣泛接受的觀點(diǎn)是,易用性可能成為一個(gè)SAAS軟件成敗的關(guān)鍵。作為SAAS應(yīng)用的使用者,肯定會(huì)關(guān)心是不是他的每一個(gè)員工都能很容易的使用這個(gè)系統(tǒng),這其實(shí)是企業(yè)部署SAAS應(yīng)用的主要成本之一。而在整個(gè)系統(tǒng)的操作中,對(duì)外觀和業(yè)務(wù)流的自定義配置很有可能成為最復(fù)雜的部分,這部分操作的易用性也將直接影響整個(gè)軟件的易用性。
想增強(qiáng)配置手段的易用性,需要我們多向salesforce這樣的成熟SAAS應(yīng)用學(xué)習(xí)取經(jīng)。
三.可擴(kuò)展性及相關(guān)技術(shù)
1.概念
應(yīng)用的可擴(kuò)展性包含兩個(gè)方面的要求:(1)高效地利用應(yīng)用資源,從而最大限度地提高并行性。(2)當(dāng)原先的服務(wù)器資源確實(shí)無(wú)法滿(mǎn)足不斷增加的用戶(hù)數(shù)量時(shí)候,可以很方面的通過(guò)向上擴(kuò)展(提升硬件性能)或橫向擴(kuò)展(增加硬件數(shù)量)來(lái)提高整個(gè)系統(tǒng)的并發(fā)處理能力??蓴U(kuò)展性并不僅僅是SAAS面對(duì)的難題,所有基于Internate的大型網(wǎng)絡(luò)應(yīng)用隊(duì)會(huì)面對(duì)這樣的挑站,所以網(wǎng)絡(luò)上相關(guān)的資料很多,大多談及大規(guī)模企業(yè)應(yīng)用的體系結(jié)構(gòu)設(shè)計(jì)的主題,都會(huì)涉及到對(duì)可擴(kuò)展性問(wèn)題的討論。筆者自己沒(méi)有開(kāi)發(fā)過(guò)大型的應(yīng)用系統(tǒng),更詳細(xì)的知識(shí)點(diǎn)需要進(jìn)一步的學(xué)習(xí)和了解之后才能給出,下面暫時(shí)只能簡(jiǎn)單列出一些筆者以前接觸過(guò)的內(nèi)容作為可能的技術(shù)研究點(diǎn)如下。
2.可擴(kuò)展性支持技術(shù)1:應(yīng)用的無(wú)狀態(tài)模式
我們需要研究如何設(shè)計(jì)應(yīng)用,使之運(yùn)行在無(wú)狀態(tài)模式下。也就是說(shuō),所有必需的用戶(hù)和會(huì)話(huà)數(shù)據(jù)都存儲(chǔ)在客戶(hù)端或分布式存儲(chǔ)設(shè)備上,任何應(yīng)用實(shí)例都能訪問(wèn)。無(wú)狀態(tài)是指每個(gè)事務(wù)處理都能由任何實(shí)例來(lái)完成,用戶(hù)在一次會(huì)話(huà)中可用眾多不同的實(shí)例進(jìn)行事務(wù)處理,但用戶(hù)本身并不知情。比如我們?cè)谧鯝sp.net開(kāi)發(fā)的時(shí)候,如果用Session變量來(lái)存儲(chǔ)狀態(tài)信息,因?yàn)樗枰加梅?wù)器資源,當(dāng)你想增加機(jī)器以擴(kuò)展性能的時(shí)候,它們會(huì)起阻礙作用,因?yàn)镾ession是與特定機(jī)器相關(guān)連的。在這方面,也許我們可以參考EJB中的關(guān)于無(wú)狀態(tài)會(huì)話(huà)Bean,以及其管理器無(wú)狀態(tài)管理器的實(shí)現(xiàn)。其實(shí),internet能發(fā)展到今天的規(guī)模,跟http這個(gè)無(wú)狀態(tài)的協(xié)議應(yīng)該有很大的關(guān)系,而internet的擴(kuò)展性已經(jīng)在現(xiàn)實(shí)世界中被印證了,所以如果我們能?chē)L試著去理解整個(gè)因特網(wǎng)的結(jié)構(gòu)特點(diǎn),也許我們對(duì)如何建構(gòu)一個(gè)高可擴(kuò)展性的大型系統(tǒng)會(huì)有更深的了解。另外,從SOA的角度來(lái)講,提倡的Service一般是Stateless的,給定什么樣的輸入,就會(huì)有對(duì)應(yīng)的確定的輸出。一旦服務(wù)有了狀態(tài),就無(wú)法方便的使用對(duì)象池來(lái)減少對(duì)象的數(shù)量,從而提高了負(fù)載。
3.可擴(kuò)展性支持技術(shù)2:大型數(shù)據(jù)庫(kù)的分解、重構(gòu)技術(shù)
MySpace是一個(gè)過(guò)億注冊(cè)用戶(hù)的超大型網(wǎng)站,在三年的發(fā)展過(guò)程中,它完成了從一個(gè)單服務(wù)器到及具擴(kuò)展性的架構(gòu)的變化,我想種變化其實(shí)對(duì)于我們研究如何建立一個(gè)可擴(kuò)展的系統(tǒng)其實(shí)有很強(qiáng)的借鑒意義:
(1)最早。兩臺(tái)Web服務(wù)器,一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,和我們目前的結(jié)構(gòu)是完全一樣的。在初期的發(fā)展中,MySpace就是通過(guò)添加新的web服務(wù)器來(lái)提高性能的,直到其數(shù)據(jù)庫(kù)服務(wù)器過(guò)載。
(2)50萬(wàn)用戶(hù)。要增加數(shù)據(jù)庫(kù),這時(shí)候面臨著保證數(shù)據(jù)一致性的問(wèn)題。在第二代架構(gòu)中,他們啟用了3個(gè)SQL Server數(shù)據(jù)庫(kù)服務(wù)器,一個(gè)為主,接受所有的數(shù)據(jù)提交,并將內(nèi)容復(fù)制給另外兩個(gè),由它們?nèi)ο蛴脩?hù)提供數(shù)據(jù)。在這個(gè)架構(gòu)中,通過(guò)增加輔數(shù)據(jù)庫(kù)服務(wù)器的方法,可以有效應(yīng)對(duì)系統(tǒng)訪問(wèn)量的增加。
(3)100-200萬(wàn)用戶(hù)。數(shù)據(jù)庫(kù)服務(wù)器開(kāi)始受制于I/O容量。這時(shí)候,把所有業(yè)務(wù)放到一個(gè)DB上看來(lái)已經(jīng)不行了,于是他們對(duì)數(shù)據(jù)庫(kù)的架構(gòu)進(jìn)行了垂直分割,不同的數(shù)據(jù)庫(kù)服務(wù)器服務(wù)于不同類(lèi)的功能,有的負(fù)責(zé)登錄,有的負(fù)責(zé)博客等。另外,但用戶(hù)達(dá)到200萬(wàn)的時(shí)候,他們啟用了存儲(chǔ)區(qū)域網(wǎng)絡(luò)(SAN:Storage Area Network)。按MySpaces的說(shuō)法,此舉極大提升了系統(tǒng)的性能、正常運(yùn)行時(shí)間和可靠性。
(4)300萬(wàn)。垂直分割不夠用了,畢竟有些信息(如用戶(hù)表)需要在所有DB中共享,維護(hù)數(shù)據(jù)一致性的開(kāi)銷(xiāo)很大。另外,有一些應(yīng)用增長(zhǎng)太快,其專(zhuān)用DB壓力太大。這時(shí)候,需要進(jìn)行向上擴(kuò)展(Scale Up:升級(jí)服務(wù)器)和向外擴(kuò)展(Scale Out:加強(qiáng)分布式能力,用大量便宜的服務(wù)器來(lái)分擔(dān)壓力)的抉擇。為了盡量少改動(dòng)以前的代碼,他們先考慮了向上擴(kuò)展,研究了如何使用32CPU的服務(wù)器的問(wèn)題。但最終,他們還是走上了向外擴(kuò)展的道路,開(kāi)始提煉分布式計(jì)算架構(gòu)(這是向外擴(kuò)展架構(gòu)必須面臨的問(wèn)題,大廠商如Google甚至開(kāi)發(fā)了自己的分布式文件系統(tǒng))。這時(shí)候,前面被拆分的應(yīng)用在邏輯上又被整合了起來(lái)。并且,用戶(hù)以百萬(wàn)為一組,被分別存儲(chǔ)不同的DB。當(dāng)然會(huì)有一個(gè)特殊的DB來(lái)控制所有的帳號(hào)和密碼,但其功能單一,也就比較容易控制負(fù)荷。
(5)1000萬(wàn)。采用了新型的SAN,更改了SAN和數(shù)據(jù)庫(kù)的綁定方式。在Web服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器之間加上數(shù)據(jù)緩存層---他們說(shuō)這是一開(kāi)始就應(yīng)該做的事情,但他們成長(zhǎng)太快,以至于一直沒(méi)有實(shí)現(xiàn)。
(6)2600萬(wàn)。采用SQl Server2005,因?yàn)橹С?4位的數(shù)據(jù)庫(kù)可以使用更多內(nèi)存。
從MySpace的變化可以看出,隨著用戶(hù)量的增加和用戶(hù)數(shù)據(jù)量的積累,數(shù)據(jù)庫(kù)服務(wù)器將日益成為瓶頸。在它成為瓶頸之前,充分做好各種相關(guān)的技術(shù)準(zhǔn)備工作是必須的。
4.可擴(kuò)展性支持技術(shù)3:線(xiàn)程和網(wǎng)絡(luò)連接等匯集資源的共享(負(fù)載均衡)
將線(xiàn)程、網(wǎng)絡(luò)連接和數(shù)據(jù)庫(kù)連接等資源集中,這有助于使計(jì)算資源最大化,并提高我們預(yù)測(cè)資源使用的能力。當(dāng)然,在這些方面,其實(shí)IIS和ADO.NET等基礎(chǔ)的資源服務(wù)系統(tǒng)已經(jīng)作了很多相關(guān)的考慮,我們做的資源調(diào)度應(yīng)該是基于這些服務(wù)器之上的。我們可以參考.Net對(duì)線(xiàn)程池的管理,也可以參考ADO.NET對(duì)連接池的管理。另外在進(jìn)行資源調(diào)度和管理的時(shí)候,要充分考慮整個(gè)網(wǎng)絡(luò)的拓樸結(jié)構(gòu),并充分借鑒分布式系統(tǒng)在實(shí)現(xiàn)方式特別是資源調(diào)度算法上的一些考慮和特點(diǎn)。
所以,這里總的來(lái)說(shuō)強(qiáng)調(diào)的是一種負(fù)載均衡的概念,而負(fù)載均衡除了上面提到的這些軟件方面的手段,可能還包括對(duì)一些硬件設(shè)備的認(rèn)識(shí)和選購(gòu),特別是對(duì)各種負(fù)載均衡服務(wù)器的性能和功能的掌握。
5.可擴(kuò)展性支持技術(shù)4:其他
(1)多級(jí)緩存技術(shù)。緩存,說(shuō)白了就是用空間換時(shí)間。越是并發(fā)的系統(tǒng),越需要仔細(xì)考慮緩存的問(wèn)題,我們每發(fā)現(xiàn)一處可以在多用戶(hù)間反復(fù)重用的數(shù)據(jù)并將其加入緩存,都有可能使這部分?jǐn)?shù)據(jù)的生成效率提高上千倍(如果這個(gè)數(shù)據(jù)可以在上千個(gè)用戶(hù)間共享的話(huà))。另外,如何提高緩存的命中率,也是當(dāng)我們的網(wǎng)站逐漸變大之后,越來(lái)越重要的問(wèn)題。還有,對(duì)于memcache這類(lèi)的比較牛的緩存解決方案,也許我們也需要深入研究它與我們項(xiàng)目的結(jié)合點(diǎn)。
(2)仔細(xì)研究數(shù)據(jù)庫(kù)的鎖定方式,在對(duì)數(shù)據(jù)庫(kù)操作的時(shí)候,盡可能鎖定小范圍的數(shù)據(jù)集合。采用既可以實(shí)現(xiàn)并發(fā)最大化,同時(shí)還能使排它鎖定最小化的方式寫(xiě)入數(shù)據(jù)庫(kù)操作。例如,在執(zhí)行只讀操作時(shí),不要鎖定記錄。這些環(huán)節(jié)看似雖小,其實(shí)對(duì)整個(gè)系統(tǒng)的并發(fā)性都有顯著的影響。
四.多用戶(hù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)及相關(guān)技術(shù)
一家公司的用戶(hù)使用我們的SAAS應(yīng)用服務(wù)存取客戶(hù)信息時(shí),該用戶(hù)連接的應(yīng)用實(shí)例同時(shí)可能還會(huì)為其他幾十家,甚或是數(shù)百家公司的用戶(hù)提供服務(wù),各用戶(hù)之間彼此互不知情。這就要求應(yīng)用架構(gòu)能夠最大化不同用戶(hù)間的資源共享,不過(guò)仍要區(qū)分屬于不同客戶(hù)的數(shù)據(jù)。所以,我們?cè)谠O(shè)計(jì)存儲(chǔ)結(jié)構(gòu)的時(shí)候,一方面要考慮結(jié)構(gòu)本身的可擴(kuò)展性,一方面還要考慮數(shù)據(jù)訪問(wèn)的安全性。
1.數(shù)據(jù)訪問(wèn)控制
數(shù)據(jù)是不是安全,會(huì)不會(huì)被沒(méi)有權(quán)限的人竊取或篡改,這是用戶(hù)最關(guān)心的,因此也是我們最關(guān)心的。安全問(wèn)題涉及的內(nèi)容也確實(shí)是非常多,筆者這里試著從幾個(gè)方面簡(jiǎn)單進(jìn)行闡述:
(1)過(guò)濾:在用戶(hù)和數(shù)據(jù)源之間加入中間層,給用戶(hù)的感覺(jué)是數(shù)據(jù)庫(kù)里只存了自己的數(shù)據(jù)。
在這方面,典型的手段是采用視圖。
(2)權(quán)限:采用ACL來(lái)限制誰(shuí)能訪問(wèn)什么數(shù)據(jù),以及可以對(duì)數(shù)據(jù)作什么操作。
在這方面,有一個(gè)很關(guān)鍵的問(wèn)題是如何建立一個(gè)受信任的連接。比較常見(jiàn)的方式有服務(wù)器模擬客戶(hù)端用戶(hù)的身份(impersonation)去訪問(wèn)數(shù)據(jù);或者服務(wù)器始終以自己的進(jìn)程身份來(lái)訪問(wèn)數(shù)據(jù)(受信任的子系統(tǒng)方式),額外的安全都放在應(yīng)用的內(nèi)部。前一種方式配置上比較復(fù)雜,但安全性較高;后一種方式不需要太多配置,但安全性較低,并且有些資源單靠服務(wù)器進(jìn)程本身的訪問(wèn)級(jí)別是訪問(wèn)不到的。我們?cè)陂_(kāi)發(fā)的時(shí)候可能需要混合使用這兩種連接方式。
另外,有些時(shí)候可能需要服務(wù)器以代理的方式來(lái)訪問(wèn)一些其他資源。
(3)認(rèn)證(Authentication)
前面幾點(diǎn)說(shuō)的都是對(duì)于某個(gè)特定的用戶(hù),系統(tǒng)如何控制他的訪問(wèn)權(quán)限(也就是說(shuō),都屬于授權(quán)/Authorization方面的問(wèn)題),那么系統(tǒng)如何知道某個(gè)客戶(hù)端請(qǐng)求確實(shí)是來(lái)自某個(gè)用戶(hù)呢?這就是Authentication要做的工作。單就這一部分,包含的知識(shí)也相當(dāng)多,以Asp.net2.0為例,就有Windows驗(yàn)證、基于表單的驗(yàn)證等;單就Windows驗(yàn)證,又有Kerberos,NTLM等不同的驗(yàn)證協(xié)議,這些驗(yàn)證協(xié)議在對(duì)代理服務(wù)器的支持、運(yùn)行效率上都是有差別的,需要我們學(xué)習(xí)和掌握。另外,在.Net3.0中,MS在這一塊兒好像又提出了一個(gè)新的概念和實(shí)現(xiàn)技術(shù),CardSpace。這個(gè)技術(shù)里應(yīng)該是凝結(jié)了MS對(duì)網(wǎng)絡(luò)安全的最新思考,筆者覺(jué)得應(yīng)當(dāng)重點(diǎn)關(guān)注(此技術(shù)和Active Directory, WCF, Windows Live ID等技術(shù)都有很強(qiáng)的相關(guān)性)。
還有,從宏觀上來(lái)看,認(rèn)證的方式分為集中式認(rèn)證(centralized authentication system)和非集中式認(rèn)證(decentralized authentication system)兩種,我們需要研究它們之間區(qū)別和聯(lián)系,結(jié)合起來(lái)利用。
(4)加密
對(duì)用戶(hù)的敏感數(shù)據(jù)進(jìn)行加密,未授權(quán)方及時(shí)獲得了這些數(shù)據(jù)也派不上用場(chǎng)??梢圆捎脤?duì)稱(chēng)或非對(duì)稱(chēng)的加密算法。非對(duì)稱(chēng)算法的保密性好,但處理開(kāi)銷(xiāo)也大得多。實(shí)際操作中,一般是兩種方式混用,即數(shù)據(jù)采用對(duì)稱(chēng)加密法,但用非對(duì)稱(chēng)加密法來(lái)加密對(duì)稱(chēng)密鑰。
其實(shí),和安全相關(guān)的問(wèn)題還有很多,比如sql注入,代碼安全等等,這里就不一一詳述了。
2.可擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)
關(guān)于這一部分,MS在其白皮書(shū)中的第二章《多用戶(hù)數(shù)據(jù)體系結(jié)構(gòu)》中已經(jīng)有了比較詳細(xì)的交待,本文中就不再重點(diǎn)介紹。可能采取的數(shù)據(jù)結(jié)構(gòu)有:(1)獨(dú)立數(shù)據(jù)庫(kù);(2)共享數(shù)據(jù)庫(kù),不同用戶(hù)有不同架構(gòu);(3)共享數(shù)據(jù)庫(kù),共享架構(gòu)。一共是三種方式,這三種方式的資源利用率越來(lái)越高,但在設(shè)計(jì)上也越來(lái)越復(fù)雜。所以,也并不是共享的程度越高越好,下面這幅圖說(shuō)明了如何在數(shù)據(jù)庫(kù)的獨(dú)立和共享性上面做以取舍:
對(duì)于三種模式中最復(fù)雜的“共享數(shù)據(jù)庫(kù),共享架構(gòu)”,MS給了兩種建議性的方案:預(yù)定義擴(kuò)展字段以及名值表。一方面,我們可以參考這些方案實(shí)現(xiàn),另一方面我們也可以思考自己的方案出來(lái)。另外,不管數(shù)據(jù)存儲(chǔ)到底采用哪種方案,都要為數(shù)據(jù)表以后可能的橫向或縱向切分留下余地。從數(shù)據(jù)庫(kù)的橫向擴(kuò)展來(lái)看,主要的手段是復(fù)制和分組,具體如何去做都需要進(jìn)一步的研究。
五.SAAS與SOA
SAAS指的是一種軟件商業(yè)模式(特別是營(yíng)銷(xiāo)模式),而SOA指的是系統(tǒng)的實(shí)現(xiàn)(包括已有系統(tǒng)的整合)方式,兩者本不在一個(gè)概念層上,但筆者在這里還是想強(qiáng)調(diào)一下兩者之間的關(guān)系,特別是SOA的相關(guān)技術(shù)對(duì)SAAS的重要性。因?yàn)樵赟OA身上體現(xiàn)了業(yè)務(wù)整合、業(yè)務(wù)敏捷等眾多特性,正是SAAS所需要的。特別是業(yè)務(wù)敏捷,雖然它強(qiáng)調(diào)的是一個(gè)企業(yè)業(yè)務(wù)在縱向時(shí)間軸上的變化和軟件的應(yīng)對(duì),而SAAS更強(qiáng)調(diào)在同一時(shí)間點(diǎn)上同步廠商之間的業(yè)務(wù)區(qū)別,但兩者在技術(shù)要求上并無(wú)本質(zhì)區(qū)別。
另外,SOA已經(jīng)漸漸成為企業(yè)應(yīng)用開(kāi)發(fā)的標(biāo)準(zhǔn),我們的用戶(hù)除了采用我們的SAAS軟件,很可能還使用了很多其他的應(yīng)用系統(tǒng)。為了能讓我們的系統(tǒng)更開(kāi)放,和其他的周邊系統(tǒng)有更好的交互,一種SOA的思想和技術(shù)手段將在我們的開(kāi)發(fā)中必不可少。
SOA本身也是一個(gè)技術(shù)集,涵蓋的面非常廣,本文在此就不展開(kāi)了。
六.其他技術(shù)
1.單點(diǎn)登錄
對(duì)現(xiàn)代網(wǎng)絡(luò)應(yīng)用易用性的基本要求之一,至少在我們系統(tǒng)內(nèi)部,我們要做到用戶(hù)一次登錄,即可訪問(wèn)所有他有權(quán)訪問(wèn)的所有子系統(tǒng)。
2.對(duì)SAAS樹(shù)狀體系結(jié)構(gòu)的進(jìn)一步認(rèn)識(shí)
SAAS本身是一個(gè)從服務(wù)提供商到各個(gè)企業(yè),從企業(yè)到各個(gè)部門(mén),從部門(mén)到每個(gè)最終用戶(hù)的樹(shù)狀管理結(jié)構(gòu),這樣的一個(gè)結(jié)構(gòu)包含一些可以利用的技術(shù)特點(diǎn):
(1)安全權(quán)限的繼承性
系統(tǒng)的授權(quán)(Ahthorization)一般都是根據(jù)用戶(hù)組/角色/Role來(lái)進(jìn)行的,在對(duì)授權(quán)的管理上,MS提出了一個(gè)“配置域”的概念。存取控制由配置域管理。每個(gè)配置域根據(jù)應(yīng)用的關(guān)系策略繼承上級(jí)配置域的角色、許可和商務(wù)規(guī)則,并可在適當(dāng)?shù)臅r(shí)候?qū)ζ溥M(jìn)行修改、添加和刪除。從概念上來(lái)說(shuō)這是非常合理的,比如一個(gè)企業(yè)內(nèi)的部門(mén)是一個(gè)配置域,它的上級(jí)配置域就是企業(yè),而下級(jí)配置域可能會(huì)具體到每個(gè)最終用戶(hù)(也可能是部門(mén)內(nèi)的小組)。但具體實(shí)現(xiàn)的時(shí)候如何去做,還需要我們進(jìn)一步研究并給出方案。
(2)用戶(hù)的不同等級(jí)
按MS的文檔,將用戶(hù)區(qū)分為“用戶(hù)”和“最終用戶(hù)”。其實(shí)這里的“用戶(hù)”指的就是一個(gè)單位或組織,不同“用戶(hù)”之間的數(shù)據(jù)至少在邏輯上是互相隔離的。而“用戶(hù)”可以為自己企業(yè)內(nèi)部的多個(gè)“最終用戶(hù)”授權(quán),最終用戶(hù)最終能在用戶(hù)的控制之下訪問(wèn)到用戶(hù)數(shù)據(jù)的一個(gè)子集。
這種把用戶(hù)分成等級(jí)來(lái)處理的方式是很有意義的,比如在建立受信任連接的時(shí)候,就可以采用用戶(hù)模擬和非用戶(hù)模擬兩種方式的結(jié)合。對(duì)用戶(hù)采用模擬方式,對(duì)最終用戶(hù)采用非模擬方式。比如在存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)的時(shí)候,可以給用戶(hù)單獨(dú)建立數(shù)據(jù)庫(kù)。
3.活動(dòng)目錄
如果我們所有的數(shù)據(jù)都取自關(guān)系數(shù)據(jù)庫(kù)服務(wù)器,那么可能永遠(yuǎn)不需要活動(dòng)目錄。但有些資源是存儲(chǔ)在文件系統(tǒng)中的,這就需要活動(dòng)目錄為我們提供存取服務(wù)了。我們需要研究原有的Active Directory技術(shù),以及剛提出的ADAM(Active Directory Application Mode)等技術(shù)。