對多數傳統 Web 系統而言,同步一直不是大問題,原因有二:
- Web 嚴格的客戶端—伺服器組織——伺服器之間從不交換資訊(客戶端之間也是),沒什麼好同步的。
- Web 可視為**讀取為主(read-mostly)**的系統:更新通常由單一人或實體進行,幾乎不會出現寫—寫衝突。
然而情勢正在改變:對 Web 文件**協作撰寫(collaborative authoring)**的需求日增——Web 應支援一群協作的使用者或行程並行更新文件;Web 服務的引入也帶來伺服器彼此同步、協調行動的需求(協調已於「架構」一節討論)。此處聚焦於協作維護 Web 文件的同步。
WebDAV#
Web 文件的分散式撰寫由獨立的協定處理:WebDAV(Web Distributed Authoring and Versioning)。它提供簡單的手段來鎖定共享文件,以及在遠端 Web 伺服器上建立、刪除、複製與搬移文件。
WebDAV 以簡單的鎖定機制同步對共享文件的並行存取,寫入鎖有兩種:
- 互斥寫入鎖(exclusive write lock):只指派給單一客戶端,鎖定期間阻止其他任何客戶端修改該共享文件。
- 共享寫入鎖(shared write lock):允許多個客戶端同時更新文件。因為鎖定的粒度是整份文件,當多個客戶端各自修改同一文件的不同部分時,共享寫入鎖很方便——但避免寫—寫衝突就得靠客戶端自己了。
鎖的運作方式:
- 指派鎖時把一個**鎖權杖(lock token)**交給請求的客戶端,伺服器記錄權杖目前在誰手上。
- 客戶端要修改文件時,對伺服器送出 HTTP post 請求並附上鎖權杖;權杖證明客戶端擁有寫入權,伺服器因此執行請求。
一個重要的設計決策是:持有鎖期間不需要維持客戶端與伺服器之間的連線。客戶端取得鎖之後可以直接斷線,要送 HTTP 請求時再重新連上。
持有鎖權杖的客戶端當機時,伺服器總得想辦法收回鎖。WebDAV 刻意不規定伺服器該如何處理這類情況,留給各實作自行決定——理由是最佳解法取決於 WebDAV 被用在哪種文件上,而孤兒鎖(orphan locks)問題本來就沒有乾淨的通用解法。