摘 要: 為了利用廉價(jià)的普通桌面電腦構(gòu)建高性能、高可靠、低成本的電子郵件備份系統(tǒng),設(shè)計(jì)了基于SOA的對(duì)等網(wǎng)絡(luò)存儲(chǔ)架構(gòu),貫徹了低耦合、無(wú)狀態(tài)、異步通信和自適應(yīng)的設(shè)計(jì)原則。系統(tǒng)將輸入數(shù)據(jù)流和輸出數(shù)據(jù)流分開(kāi)處理,分別將郵件數(shù)據(jù)和索引信息保存在磁盤(pán)文件和數(shù)據(jù)庫(kù)中,兼顧了高容量和快速查找的的要求。
關(guān)鍵詞: 電子郵件;備份;分布式存儲(chǔ);SOA;低成本
在一個(gè)在線電子郵件掃描系統(tǒng)中,需要設(shè)計(jì)一個(gè)安全可靠的存儲(chǔ)系統(tǒng),暫時(shí)保存被隔離的電子郵件。這些郵件一直保留在系統(tǒng)內(nèi),直到用戶選擇釋放或者到期失效。這是一個(gè)需要精心設(shè)計(jì)的系統(tǒng),考慮牽涉到的數(shù)據(jù)量和在線系統(tǒng)所要求的高可靠性,如何用盡可能低的成本實(shí)現(xiàn)這個(gè)系統(tǒng),成為項(xiàng)目團(tuán)隊(duì)面對(duì)的主要挑戰(zhàn)。
1 分布式郵件備份系統(tǒng)的技術(shù)需求和設(shè)計(jì)原則
郵件備份系統(tǒng)最基本的要求是高吞吐量,具體來(lái)講,要求能達(dá)到每秒1 000封郵件(平均大小10 KB)的最大輸入速度,用戶的郵件要能保存最多60天,系統(tǒng)總?cè)萘吭?0 TB以上,用戶的檢索速度應(yīng)該控制在1 s以內(nèi)。
作為一個(gè)商業(yè)運(yùn)營(yíng)的在線系統(tǒng),除了具備很高的性能以外,還要具備很高的可靠性和盡可能低的成本。系統(tǒng)的SLA[1](Service Level Agreement)要達(dá)到99.99%以上,也就是說(shuō)運(yùn)行一年的停機(jī)時(shí)間必須控制在52 min以內(nèi)。在線系統(tǒng)的主要成本包括數(shù)據(jù)中心的成本和運(yùn)行維護(hù)成本。數(shù)據(jù)中心的成本主要由硬件成本、網(wǎng)絡(luò)成本、其他成本如電費(fèi)、冷卻、機(jī)架空間等構(gòu)成,而運(yùn)營(yíng)成本主要由運(yùn)營(yíng)維護(hù)、技術(shù)支持等費(fèi)用構(gòu)成。依據(jù)上述基本要求,確定了郵件備份系統(tǒng)的基本技術(shù)需求:(1)單機(jī)高效率,系統(tǒng)高吞吐;(2)使用低成本硬件,避免使用昂貴硬件;(3)提供高可伸縮性;(4)部署自動(dòng)化;(5)管理智能化。
根據(jù)上述需求,確立系統(tǒng)整體設(shè)計(jì)的原則,主要包括下述四點(diǎn):
?。?)低耦合。耦合是指系統(tǒng)的子模塊之間結(jié)合的緊密程度,一個(gè)低耦合的系統(tǒng)不但要降低模塊之間的靜態(tài)依賴關(guān)系,而且要盡可能地降低模塊在時(shí)間和空間上的依賴關(guān)系。低耦合的系統(tǒng)可以降低模塊之間的相互影響,提高系統(tǒng)的擴(kuò)展性。
?。?)無(wú)狀態(tài)。無(wú)狀態(tài)的服務(wù)不在內(nèi)部保留狀態(tài)數(shù)據(jù),上一個(gè)請(qǐng)求和下一個(gè)請(qǐng)求之間沒(méi)有任何關(guān)系。無(wú)狀態(tài)的服務(wù)更容易實(shí)現(xiàn)水平擴(kuò)展。
?。?)異步通信。異步通信可以提高通信的效率,請(qǐng)求發(fā)送者無(wú)需等待服務(wù)的返回,節(jié)點(diǎn)之間不需要互相等待,可以提高每個(gè)節(jié)點(diǎn)的處理效率。
(4)自適應(yīng)。自適應(yīng)的系統(tǒng)能夠自動(dòng)調(diào)整、優(yōu)化運(yùn)行參數(shù)、應(yīng)對(duì)運(yùn)行環(huán)境的變化。能夠自我調(diào)整,也就減少了人為干預(yù)的要求,降低了維護(hù)費(fèi)用,而且自動(dòng)調(diào)整顯然比人為干預(yù)反應(yīng)更快、也更準(zhǔn)確,所以也提高了可靠性。
2 分布式郵件備份系統(tǒng)的設(shè)計(jì)
2.1 整體框架設(shè)計(jì)
系統(tǒng)的整體設(shè)計(jì)采用SOA[2]的架構(gòu),系統(tǒng)由三種不同的角色構(gòu)成,其關(guān)系如圖1所示。
組件A和B完成系統(tǒng)特定的某些功能,A和B對(duì)外部提供Restful[3]風(fēng)格的Web應(yīng)用接口,但是A和B之間互相沒(méi)有調(diào)用關(guān)系,也不知道彼此的存在。Registry是一個(gè)注冊(cè)服務(wù)器[4],所有的組件都在Registry注冊(cè),并不斷通過(guò)心跳信號(hào)更新自己的狀態(tài)到Registry;而且Registry維護(hù)一張系統(tǒng)所有組件的狀態(tài)表,對(duì)于超時(shí)沒(méi)有更新的組件,就將其從列表中刪除。Helper負(fù)責(zé)將數(shù)據(jù)從一個(gè)組件傳送到另一個(gè)組件;可以從Registry得到當(dāng)前系統(tǒng)的所有組件清單以及組件之間的邏輯聯(lián)系關(guān)系,并據(jù)此進(jìn)行數(shù)據(jù)轉(zhuǎn)運(yùn)工作;使用標(biāo)準(zhǔn)的HTTP命令從一個(gè)組件的輸出隊(duì)列得到數(shù)據(jù),然后同樣用HTTP命令將數(shù)據(jù)發(fā)送到下游的組件。
同一類型的組件可以同時(shí)有多個(gè)實(shí)例存在,以提供高可靠性和任務(wù)負(fù)載的均衡擴(kuò)充。Helper本身也可以有多個(gè)實(shí)例存在,提供多個(gè)上游組件和下游組件之間的動(dòng)態(tài)數(shù)據(jù)交換和負(fù)載均衡。
組件工作在異步的模式下,每個(gè)組件都有一個(gè)輸入隊(duì)列和一個(gè)輸出隊(duì)列,需要處理的數(shù)據(jù)通過(guò)Web接口被放進(jìn)輸入隊(duì)列,組件的數(shù)據(jù)處理程序依次從輸入隊(duì)列讀取數(shù)據(jù),處理完成后放入輸出隊(duì)列,然后通過(guò)Web接口被取走。組件擁有完成處理工作所需要的所有資源和數(shù)據(jù),可以獨(dú)立完成自己的任務(wù)。這是保證組件異步、高效工作的重要前提條件。
一個(gè)最簡(jiǎn)單的系統(tǒng)至少包括三種不同的功能組件,它們分別是Generator、Processor和Terminator。它們之間的關(guān)系如圖2所示。
Generator是任務(wù)的發(fā)起方,一個(gè)Generator至少有一個(gè)任務(wù)輸出隊(duì)列和一個(gè)對(duì)應(yīng)的ACK輸入隊(duì)列。Generator產(chǎn)生的任務(wù)數(shù)據(jù)在任務(wù)輸出隊(duì)列中排隊(duì)等候Helper轉(zhuǎn)送到Processor進(jìn)行處理。一旦一個(gè)任務(wù)被送到Processor,這個(gè)任務(wù)就被放入一個(gè)等候確認(rèn)的隊(duì)列,等候任務(wù)完成的確認(rèn)。Processor至少有一個(gè)任務(wù)輸入隊(duì)列和一個(gè)結(jié)果輸出隊(duì)列,即從任務(wù)輸入隊(duì)列取得待處理任務(wù),進(jìn)行處理后放入結(jié)果輸出隊(duì)列,由Helper送到Terminator。Terminator對(duì)結(jié)果進(jìn)行最后的處理后,生成對(duì)應(yīng)的ACK,ACK被送回Generator,完成一個(gè)完整的任務(wù)處理生命周期。如果Generator在規(guī)定時(shí)間里沒(méi)有收到一個(gè)任務(wù)的ACK,說(shuō)明這個(gè)任務(wù)可能在系統(tǒng)內(nèi)被丟失了,按不同的業(yè)務(wù)邏輯,Generator可以重新發(fā)送這個(gè)任務(wù),也可以丟棄這個(gè)任務(wù)。確認(rèn)-重發(fā)機(jī)制保證了異步系統(tǒng)中數(shù)據(jù)的可靠性問(wèn)題,較好地解決了節(jié)點(diǎn)失效時(shí)丟失任務(wù)的問(wèn)題。此外,通過(guò)Helper橋接的設(shè)計(jì)允許在一個(gè)任務(wù)處理序列里組合多個(gè)不同的Processor來(lái)完成復(fù)雜的任務(wù)而不用修改程序,這種重組甚至可以在運(yùn)行中的系統(tǒng)上動(dòng)態(tài)完成,大大提高了系統(tǒng)的彈性。
圖3是郵件備份系統(tǒng)的架構(gòu)圖,主要的組件是QtStorage和QtDAL。QtStorage負(fù)責(zé)存儲(chǔ)郵件的原始信息(包括郵件的原文、發(fā)送者、接收者等信息),將收到的郵件寫(xiě)入存儲(chǔ)區(qū)域后,會(huì)將郵件及相關(guān)信息編制成摘要。QtDAL負(fù)責(zé)將郵件的摘要存儲(chǔ)在數(shù)據(jù)庫(kù)中,并為用戶提供檢索服務(wù)。為了實(shí)現(xiàn)高效率的運(yùn)作,存儲(chǔ)系統(tǒng)的設(shè)計(jì)采用了讀寫(xiě)分開(kāi)的思想。大量原始數(shù)據(jù)的寫(xiě)入在QtStorage上完成,QtStorage擁有多個(gè)實(shí)例,可以分散寫(xiě)入的壓力,同時(shí)也能夠提供多重冗余,實(shí)現(xiàn)高可用性。QtStorage可以實(shí)現(xiàn)無(wú)縫的橫向擴(kuò)展,其存儲(chǔ)能力和容量隨之?dāng)U展。經(jīng)過(guò)QtStorage處理過(guò)的摘要信息,其容量已經(jīng)大大縮減,所以可以采用單一的索引節(jié)點(diǎn)來(lái)保存,單一節(jié)點(diǎn)可以以較低的代價(jià)實(shí)現(xiàn)數(shù)據(jù)的一致性。這里的QtDAL就是這樣的一個(gè)索引節(jié)點(diǎn),用戶的查找和讀取主要發(fā)生在QtDAL上,查找和讀取索引信息和數(shù)據(jù)的寫(xiě)入發(fā)生在不同的節(jié)點(diǎn)上,這樣就實(shí)現(xiàn)了數(shù)據(jù)的讀寫(xiě)分開(kāi),提高了運(yùn)行效率。只有在用戶需要取回被隔離的原始郵件時(shí),才會(huì)到QtStorage上去讀取,按照系統(tǒng)的設(shè)計(jì)邏輯,這是一個(gè)概率極低的操作,不會(huì)對(duì)系統(tǒng)構(gòu)成很大的影響。
2.2 文件存儲(chǔ)服務(wù)
文件存儲(chǔ)服務(wù)為整個(gè)系統(tǒng)提供原始數(shù)據(jù)的存儲(chǔ)服務(wù)。根據(jù)經(jīng)驗(yàn),這部分的成本是整個(gè)系統(tǒng)成本的主要構(gòu)成部分。為了保持低成本,必須避免使用價(jià)格昂貴的高性能存儲(chǔ)設(shè)備,如SAN、NAS等。而且為了便于擴(kuò)展和維護(hù),一些需要特別硬件支持的存儲(chǔ)設(shè)備也不能考慮,如RAID陣列等。一個(gè)可行的設(shè)計(jì)思路是使用最廉價(jià)的PC和隨機(jī)安裝的硬盤(pán)來(lái)構(gòu)成系統(tǒng)。商用的PC可以安裝4個(gè)處理核心的CPU和2 TB以上的硬盤(pán),其性能和容量已經(jīng)足以滿足系統(tǒng)的需求。但是不論是PC的硬件還是硬盤(pán)本身,其可靠性和穩(wěn)定性都不能達(dá)到99.99%的可靠性。解決的方法是用多重冗余的方式構(gòu)建系統(tǒng),不但數(shù)據(jù)的保存是多重冗余的,而且處理節(jié)點(diǎn)也是多重冗余的。
2.2.1 數(shù)據(jù)的寫(xiě)入
圖4是文件存儲(chǔ)系統(tǒng)的設(shè)計(jì)。Storage 1~3是3個(gè)存儲(chǔ)節(jié)點(diǎn),各自帶有2 TB的硬盤(pán)存儲(chǔ)數(shù)據(jù),并對(duì)外開(kāi)放3個(gè)Web接口,分別是接收文件輸入的Input Queue、輸出文件索引信息的Index Queue和輸出文件同步包的Sync Queue。一個(gè)文件的存儲(chǔ)過(guò)程可以用以下步驟描述:
?。?)Helper隨機(jī)挑選一個(gè)Storage節(jié)點(diǎn)(例如Storage 1),將待保存的文件及控制信息一起發(fā)送到Storage 1的Input Queue。
?。?)Storage 1將文件存盤(pán),生成文件的索引信息,將索引放到Index Queue。
?。?)Storage 1修改文件控制信息,將文件和控制信息添加到Sync Queue。
?。?)Helper從Storage 1的Sync Queue中將待同步文件取出,送到另一個(gè)Storage節(jié)點(diǎn)(例如Storage 2)。
?。?)Helper將索引信息從Storage 1取出,送到數(shù)據(jù)庫(kù)保存。
?。?)Storage 2重復(fù)上述步驟,直到重復(fù)存儲(chǔ)次數(shù)達(dá)到需要的冗余度為止。
這個(gè)設(shè)計(jì)的主要特點(diǎn)如下:
?。?)每個(gè)Storage節(jié)點(diǎn)都同時(shí)具有處理能力和存儲(chǔ)容量,添加節(jié)點(diǎn)就可以同時(shí)擴(kuò)展處理能力和容量,系統(tǒng)的擴(kuò)展是對(duì)稱的,非常利于管理和維護(hù)。
(2)Storage節(jié)點(diǎn)之間沒(méi)有相互依賴性,任何一個(gè)Storage節(jié)點(diǎn)因?yàn)楣收舷戮€,都不會(huì)對(duì)整個(gè)系統(tǒng)產(chǎn)生影響。
?。?)每個(gè)文件需要多少冗余度、是否加密、是否壓縮,都可以單獨(dú)控制,非常靈活。
?。?)添加新的Storage節(jié)點(diǎn)后,負(fù)載會(huì)自動(dòng)均衡到新的節(jié)點(diǎn)上,有利于資源的有效利用。
?。?)系統(tǒng)要求的保存文件期限最多60天,所以在3冗余或更多冗余的情況下,可以不用考慮損壞節(jié)點(diǎn)的文件恢復(fù)功能。即使使用可靠性較低的普通PC和SATA硬盤(pán),也可以保證文件在60天內(nèi)的可用性。
(6)讀寫(xiě)分開(kāi),大負(fù)荷的文件寫(xiě)入被分散到數(shù)量眾多的Storage節(jié)點(diǎn)上,數(shù)據(jù)庫(kù)節(jié)點(diǎn)只負(fù)責(zé)少量、偶爾的用戶查詢操作,提高了硬件效率,降低了成本。
(7)系統(tǒng)并不是嚴(yán)格一致的,通過(guò)犧牲部分一致性,獲得了較好的擴(kuò)展性和可用性,是CAP[5]原則的具體實(shí)踐。
?。?)Storage節(jié)點(diǎn)之間是沒(méi)有聯(lián)系、沒(méi)有交互的,所有的數(shù)據(jù)交換都通過(guò)Helper進(jìn)行。文件的控制信息隨同文件數(shù)據(jù)本身傳送,沒(méi)有任何一個(gè)節(jié)點(diǎn)管理和追蹤文件的去向,各個(gè)節(jié)點(diǎn)間通過(guò)合作完成任務(wù),沒(méi)有中心控制節(jié)點(diǎn)。這個(gè)過(guò)程充分體現(xiàn)了“低耦合”、“異步”、“無(wú)狀態(tài)”的設(shè)計(jì)原則。
需要說(shuō)明的是,Storage節(jié)點(diǎn)的數(shù)目建議大于系統(tǒng)設(shè)置的最高冗余度。例如對(duì)于3冗余的系統(tǒng),Storage節(jié)點(diǎn)建議至少設(shè)置4個(gè),這樣,在某一個(gè)節(jié)點(diǎn)因故下線的時(shí)候,系統(tǒng)仍然可以正常運(yùn)行。當(dāng)然,設(shè)置更多的節(jié)點(diǎn)可以獲得更好的可靠性和性能。
2.2.2 數(shù)據(jù)的查詢
數(shù)據(jù)的查詢相當(dāng)簡(jiǎn)單,按照用戶提供的查詢條件,可以在數(shù)據(jù)庫(kù)中查詢到符合條件的記錄,每條記錄中都包含對(duì)應(yīng)的數(shù)據(jù)文件在Storage節(jié)點(diǎn)上的位置。如果用戶需要讀取原始數(shù)據(jù),可以調(diào)用Storage節(jié)點(diǎn)上的API接口,提供位置信息,讀取原始數(shù)據(jù)。記錄中包含文件的多個(gè)冗余備份的位置,如果一個(gè)節(jié)點(diǎn)失效或者不能訪問(wèn),可以讀取備用節(jié)點(diǎn)上的信息。
2.2.3 數(shù)據(jù)的刪除
數(shù)據(jù)的刪除分為數(shù)據(jù)庫(kù)記錄的刪除和數(shù)據(jù)文件的刪除,數(shù)據(jù)庫(kù)節(jié)點(diǎn)和Storage節(jié)點(diǎn)都有內(nèi)置的定時(shí)任務(wù),可以按時(shí)間刪除已經(jīng)過(guò)期的數(shù)據(jù)。
2.2.4 系統(tǒng)容量的擴(kuò)展和故障節(jié)點(diǎn)的替換
當(dāng)文件存儲(chǔ)系統(tǒng)的容量不能滿足要求時(shí),需要對(duì)系統(tǒng)容量進(jìn)行擴(kuò)展,這種擴(kuò)展應(yīng)該是一種簡(jiǎn)單的、無(wú)縫的操作,不能干擾系統(tǒng)的正常運(yùn)行,不需要修改軟件,不需要停機(jī)以及盡量少的配置改動(dòng)。本系統(tǒng)較好地實(shí)現(xiàn)了上述要求。
2.3 索引數(shù)據(jù)庫(kù)
索引數(shù)據(jù)庫(kù)保存著所有備份郵件的索引信息和位置信息。這是一個(gè)標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù),采用開(kāi)源的PostgresSQL實(shí)現(xiàn)。數(shù)據(jù)庫(kù)主要包括兩張表,如圖5所示。
為了提高數(shù)據(jù)的安全性,可以設(shè)置將備份的郵件在不同節(jié)點(diǎn)上拷貝多份冗余。圖7即為冗余度設(shè)置為2時(shí)的測(cè)試數(shù)據(jù),考察了不同節(jié)點(diǎn)數(shù)量對(duì)性能的影響??梢钥吹?,隨著系統(tǒng)節(jié)點(diǎn)數(shù)的增加,系統(tǒng)性能也呈基本線性地增加,這充分反映了節(jié)點(diǎn)間異步通信的重要性。異步通信削弱了節(jié)點(diǎn)間在時(shí)間上的依賴關(guān)系,通過(guò)犧牲局部的、臨時(shí)的一致性,充分發(fā)揮了每個(gè)節(jié)點(diǎn)的處理能力,提高了系統(tǒng)的效率。
為了進(jìn)一步提高數(shù)據(jù)可靠性,可以把冗余度設(shè)置到3,此時(shí)每封郵件在系統(tǒng)內(nèi)有三份拷貝,達(dá)到了極高的可靠性。如圖8所示,在4節(jié)點(diǎn)3冗余的測(cè)試環(huán)境下,系統(tǒng)的吞吐速率達(dá)到了3 000封/s(10 KB郵件)和2 000封/s(30 KB郵件)。如果等價(jià)成單個(gè)節(jié)點(diǎn)的平均速率的話,分別達(dá)到2 250封/s和1 500封/s,比單節(jié)點(diǎn)的性能還要好些。這是因?yàn)殡S節(jié)點(diǎn)的增多,不但存儲(chǔ)空間得到擴(kuò)展、可靠性得到增加,CPU的數(shù)量和處理能力也得到加強(qiáng),更多的CPU的加入,也在一定程度上提高了系統(tǒng)的整體處理能力。
3.3 結(jié)果分析
通過(guò)對(duì)結(jié)果的分析,發(fā)現(xiàn)在單節(jié)點(diǎn)場(chǎng)景下,采用30 KB郵件樣本時(shí)系統(tǒng)達(dá)到了42 MB/s的寫(xiě)入速度,而10 KB郵件的寫(xiě)入速度為18 MB/s,兩種測(cè)試環(huán)境中CPU占用均為30%左右,說(shuō)明系統(tǒng)瓶頸不在CPU和I/O中。通過(guò)對(duì)代碼實(shí)現(xiàn)的審查發(fā)現(xiàn),問(wèn)題主要是同步寫(xiě)文件導(dǎo)致的,對(duì)文件的同步讀寫(xiě)操作降低了I/O的效率,并且隨樣本的縮小,讀寫(xiě)操作的頻繁化而更趨惡化。這就是為什么小樣本性能不成比例增加的根本原因。全面采用異步磁盤(pán)I/O操作可以很好地改善這個(gè)問(wèn)題,但是異步I/O程序遠(yuǎn)較同步I/O復(fù)雜,而且在本項(xiàng)目里,即使是同步I/O也足夠滿足性能需求,所以本設(shè)計(jì)最后決定保持目前的代碼不變。
比較不同組合條件下的測(cè)試結(jié)果可以發(fā)現(xiàn),性能隨冗余度的增加而降低、隨節(jié)點(diǎn)數(shù)目的增加而提高,三者間的關(guān)系接近線性關(guān)系。如果節(jié)點(diǎn)數(shù)目增加一倍,性能也能夠增加一倍。增加冗余度會(huì)降低性能,但可以通過(guò)增加節(jié)點(diǎn)來(lái)補(bǔ)償。同時(shí)添加節(jié)點(diǎn)數(shù)量和冗余度,能夠得到更好的可靠性和性能,并且收益并不隨節(jié)點(diǎn)數(shù)目的增加而遞減。對(duì)于一個(gè)分布式系統(tǒng),這是一個(gè)非??少F的特質(zhì)。因?yàn)楣芾碚呖梢酝ㄟ^(guò)簡(jiǎn)單的添加處理節(jié)點(diǎn),獲取更多的存儲(chǔ)和處理能力。
為了最大限度地降低成本、提高可靠性,在設(shè)計(jì)的初期階段就確立了低耦合、無(wú)狀態(tài)、異步通信和自適應(yīng)這四個(gè)設(shè)計(jì)準(zhǔn)則。通過(guò)放寬對(duì)一致性的要求,僅保證最終一致性,充分解耦各個(gè)節(jié)點(diǎn)間的依賴關(guān)系,獲得了優(yōu)異的可靠性和可擴(kuò)展性。最終的測(cè)試結(jié)果也證明了這種設(shè)計(jì)思路的正確性,采用普通桌面計(jì)算機(jī)和廉價(jià)磁盤(pán)組成的系統(tǒng)足以在容量、性能、可靠性和可擴(kuò)展性方面滿足要求,而成本僅為傳統(tǒng)方案的十分之一。
參考文獻(xiàn)
[1] TANENBAUM A S, STEEN M V. Distributed systems principles and paradigms[M].楊劍鋒,常曉波,李敏,譯,北京:清華大學(xué)出版社,2004.
[2] JOSUTTIS N M. SOA in practice[M].程樺,譯.北京:電子工業(yè)出版社,2008.
[3] ROCHARDSON L, RUBY S. RESTful Web Services中文版[M].徐涵,李紅軍,胡偉,譯.北京:電子工業(yè)出版社,2008.
[4] 杜宗霞, 懷進(jìn)鵬, 主動(dòng)分布式Web服務(wù)注冊(cè)機(jī)制研究與實(shí)現(xiàn)[J]. 軟件學(xué)報(bào),2006,17(3):454-462
[5] BREWER E A. Towards robust distributed systems. (Invited Talk)Principles of Distributed Computing, Portland, Oregon, July 2000.