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