Lamport 時鐘
使用邏輯時間戳記作為值的版本,以允許跨伺服器對值進行排序
問題
當值儲存在多個伺服器中時,需要一種方法來知道哪些值儲存在其他值之前。無法使用系統時間戳記,因為它們不是單調的,並且不應比較來自兩個不同伺服器的時鐘值。
系統時間戳記代表一天中的時間,通常使用以晶體振盪器建構的時鐘機械進行測量。此機制的已知問題是它可能會偏離一天中的實際時間。為了解決此問題,電腦通常會使用 NTP 等服務,將電腦時鐘與網際網路上的參考時間來源同步。因此,在特定伺服器上連續讀取系統時間兩次,時間可能會倒退。
由於伺服器之間的時鐘漂移沒有上限,因此無法比較兩個不同伺服器上的時間戳記
解決方案
Lamport 時鐘維護一個單一數字來表示時間戳記:每個叢集節點維護一個 Lamport 時鐘實例。
每當伺服器執行任何寫入操作時,它都應使用 `tick()` 方法推進 Lamport 時鐘
類別 LamportClock
public int tick(int requestTime) { latestTime = Integer.max(latestTime, requestTime); latestTime++; return latestTime; }
這樣,伺服器可以確定寫入是在請求之後以及伺服器自客戶端啟動請求以來執行的任何其他動作之後進行排序的。伺服器會傳回用於將值寫入客戶端的時間戳記。然後,請求的客戶端使用此時間戳記對其他伺服器集發出任何進一步的寫入。這樣,請求的因果鏈就會被維護。
有關更多詳細資訊,請前往 oreilly.com 上的線上電子書 第 22 章
此模式為 分散式系統模式 的一部分
2023 年 11 月 23 日