探秘Google Wave技術(shù)架構(gòu)
Google Wave是一個(gè)工具,也是一個(gè)平臺(tái)、還是一個(gè)協(xié)議。其架構(gòu)的核心是操作轉(zhuǎn)換(Operational Transformation,OT),這是一個(gè)支持并發(fā)控制的理論型框架。
首先需要看看Google Wave的定義:
Google Wave是基于托管型XML文檔(稱為Wave)的新型溝通、協(xié)作平臺(tái),支持并發(fā)修改和低延遲更新。
工具
Google Wave是一個(gè)兼?zhèn)潆娮余]件、即時(shí)通訊、協(xié)作文檔共享和編輯的工具。在Chrome、Firefox、Safari等瀏覽器里運(yùn)行的客戶端中(包括移動(dòng)平臺(tái)iPhone和Android),Wave使用JavaScript和HTML5,Wave在服務(wù)器端則結(jié)合使用Java和Python,但服務(wù)器端可以用用戶希望的任何方式來(lái)實(shí)現(xiàn)。該工具用GWT構(gòu)建,并使用Google Gears處理HTML 5中尚未包含的拖拽。該工具需要專門的服務(wù)器來(lái)處理并發(fā)通訊,大型團(tuán)隊(duì)尤其需要這樣的服務(wù)器。服務(wù)器可以放在企業(yè)外的云里,也可以放置在私有企業(yè)內(nèi)部,或者只是放在某人的家里。
Google Wave上周在Google I/O大會(huì)期間進(jìn)行了展示。
平臺(tái)
Google Wave帶有一個(gè)公共的API,Google公司承諾在產(chǎn)品正式上線之前會(huì)開(kāi)源整個(gè)平臺(tái)。作為平臺(tái),Wave允許開(kāi)發(fā)人員修改基礎(chǔ)代碼、使用Gadgets和Robots對(duì)其進(jìn)行擴(kuò)展。Gadgets是運(yùn)行在Wave中的小程序,而Robots則是“自動(dòng)的Wave參與者”。Wave還可以嵌到博客等其它媒體當(dāng)中。
協(xié)議
數(shù)據(jù)模型
Google Wave數(shù)據(jù)模型的主要元素有:
Wave——每個(gè)Wave都有一個(gè)全局唯一的Wave ID,并包含一組Wavelet。
Wavelet——Wavelet在其所屬的Wave中有一個(gè)唯一ID,Wavelet由一個(gè)參與者列表和一組文檔組成。Wavelet是并發(fā)控制/操作轉(zhuǎn)換請(qǐng)求的實(shí)體。
參與者——參與者由Wave地址確定,Wave地址是文本字符串,格式與電子郵件地址相同(local-part@domain)。參與者可以是用戶,也可以是組,或者是Robot。每個(gè)參與者在參與者列表中最多可出現(xiàn)一次。
文檔——文檔在其所屬的Wave中有一個(gè)唯一ID,由一個(gè)XML文檔和一組“分離”注解組成。分離注解指向XML文檔,不依賴于XML文檔的結(jié)構(gòu)。它們用來(lái)表示文本格式、拼寫建議和超鏈接。文檔在Wavelet中構(gòu)成一棵樹(shù)。
Wave視圖——Wave視圖是特定用戶在一個(gè)Wave中訪問(wèn)的Wavelet子集。用戶只要是Wavelet的參與者,或者是參與者組的成員(組可以嵌套),都可以訪問(wèn)Wavelet。
操作轉(zhuǎn)換
這是Wave技術(shù)的重要組成部分。Google Wave廣泛使用了在服務(wù)器端執(zhí)行的操作轉(zhuǎn)換(OT)。 當(dāng)用戶編輯多個(gè)用戶同時(shí)打開(kāi)的協(xié)作文檔時(shí),客戶端程序會(huì)提供一個(gè)Optimistic UI,立即顯示用戶輸入的內(nèi)容,同時(shí)將編輯操作發(fā)送給服務(wù)器,希望該操作能被服務(wù)器接收??蛻舳说却?wù)器評(píng)估該操作,在服務(wù)器應(yīng)答之前會(huì)緩存其它所有的操作。服務(wù)器應(yīng)答之后,所有被緩存的操作會(huì)從客戶端批量發(fā)送到服務(wù)器。服務(wù)器考慮從其它客戶端接收到的操作,相應(yīng)地轉(zhuǎn)換操作,并將該轉(zhuǎn)換通知給所有的客戶端,客戶端相應(yīng)地更新其UI。操作被發(fā)送至服務(wù)器,并由特性規(guī)則根據(jù)特性傳播到各個(gè)客戶端,除非該操作是批量操作。服務(wù)器是文檔及其版本的管理者,其中版本被認(rèn)為是“正確的”版本。***,各個(gè)客戶端會(huì)根據(jù)從服務(wù)器接收到的最終版本進(jìn)行更新,該最終版本可能是很多操作轉(zhuǎn)換的結(jié)果。還有很多針對(duì)通訊失敗或服務(wù)器/客戶端崩潰而提供的恢復(fù)措施。為了迅速地識(shí)別誤傳,在客戶端和服務(wù)器間交換的所有XML文檔只帶一個(gè)總和校驗(yàn)碼。
客戶端-服務(wù)器協(xié)議
操作。Wave的基本組成部分Wavelet經(jīng)過(guò)一系列被稱為操作轉(zhuǎn)換的改變。這些改變需要傳播并應(yīng)用到每個(gè)客戶端,否則客戶端就不能同步。
操作隊(duì)列。所有對(duì)Wavelet的操作都按照嚴(yán)格的順序發(fā)送。服務(wù)器對(duì)一個(gè)操作做出響應(yīng)之后,下一個(gè)操作才會(huì)被發(fā)送。服務(wù)器基于版本號(hào)給操作排序。每個(gè)客戶端都要按照合適的順序應(yīng)用操作。
打開(kāi)Wavelet。要開(kāi)始與Wavelet通訊,客戶端要給服務(wù)器發(fā)送一個(gè)Open請(qǐng)求,里面包含Wave ID和Wavelet ID。服務(wù)器響應(yīng)是一個(gè)快照——Wavelet的序列化狀態(tài),或者是相應(yīng)版本的歷史散列。
服務(wù)器到客戶端的通訊。服務(wù)器發(fā)送到客戶端的內(nèi)容是Delta(一或多個(gè)操作的序列)、版本號(hào)和歷史散列之一。
客戶端到服務(wù)器的通訊。客戶端發(fā)送的內(nèi)容是Delta或版本號(hào)。
恢復(fù)。通訊失敗時(shí),客戶端通過(guò)發(fā)送先前從服務(wù)器接收到的散列歷史重新打開(kāi)Servlet。
聯(lián)盟
Google Wave Federation協(xié)議允許多個(gè)實(shí)體(Wave提供者)彼此分享Waves。Wave提供者可以是在某人家里運(yùn)行的服務(wù)器,為單個(gè)用戶或所有家庭成員提供Wave,也可以是一家公司、或一個(gè)ISP,Google只是另一個(gè)Wave提供者。
【編輯推薦】