Zegar Lamporta nie mierzy godziny — mierzy logiczną kolejność
Nazwa „zegar logiczny” może sugerować sztuczny zegarek, ale jego zadanie jest inne. Zegar Lamporta przypisuje zdarzeniom rosnące liczby tak, aby jeśli zdarzenie A mogło przyczynowo poprzedzać B, to liczba A była mniejsza od liczby B. Nie próbuje powiedzieć, ile sekund upłynęło ani która jest godzina. Dzięki prostemu licznikowi i przekazywaniu jego wartości w wiadomościach procesy mogą zachować kluczową informację o kolejności bez wspólnego fizycznego zegara. To przykład rozwiązania, które działa właśnie dlatego, że rezygnuje z odpowiedzi na trudniejsze pytanie i przechowuje tylko informację naprawdę potrzebną algorytmowi.
Problem nie wymagał idealnego czasu
Jeżeli system musi wiedzieć, że zapis konfiguracji nastąpił przed operacją, która go wykorzystała, interesuje nas zależność, a nie różnica w milisekundach. Lamport zauważył, że do wielu algorytmów nie jest potrzebny fizyczny czas. Wystarczy mechanizm zachowujący relację „happened before”.
Każdy proces ma prosty licznik
Proces zwiększa swój zegar logiczny przed kolejnymi zdarzeniami. Gdy wysyła wiadomość, dołącza wartość zegara. Odbiorca ustawia swój licznik tak, aby był większy od wartości otrzymanej i od własnego dotychczasowego czasu. W rezultacie odbiór wiadomości zawsze ma większy timestamp logiczny niż jej wysłanie.
Liczba nie oznacza sekund
Jeżeli zdarzenie ma timestamp 105, nie znaczy to, że wydarzyło się 105 sekund od startu. Nie można też bez dodatkowej informacji powiedzieć, jak duża fizyczna przerwa dzieli 104 i 105. Zegar logiczny jest etykietą porządkującą, nie przyrządem pomiarowym.
Jest jedna ważna asymetria
Jeżeli A wydarzyło się przed B w sensie przyczynowym, zegar Lamporta zagwarantuje `L(A) < L(B)`. Odwrotność nie musi być prawdziwa: mniejsza liczba nie dowodzi automatycznie, że A wpłynęło na B. Dwa niezależne zdarzenia mogą dostać różne wartości tylko dlatego, że algorytm potrzebuje wygodnego porządku.
Prostota stała się zaletą
Zegary Lamporta są klasycznym przykładem abstrahowania problemu. Zamiast doskonalić synchronizację fizycznych zegarów, rozwiązanie pyta: jaka jest minimalna informacja potrzebna do zachowania przyczynowej kolejności? Odpowiedzią okazuje się niewielki licznik. Ta idea stała się podstawą dalszych mechanizmów wersjonowania i porządkowania w systemach rozproszonych.
Zegar logiczny może tworzyć pełny porządek techniczny
Sam warunek Lamporta daje relację zgodną z przyczynowością. Jeśli algorytm potrzebuje dodatkowo rozstrzygnąć remis między niezależnymi zdarzeniami, można do wartości logicznego zegara dodać identyfikator procesu i uzyskać stabilny total order. Taki porządek jest użyteczny do arbitrażu czy kolejek, ale nadal nie dowodzi związku przyczynowego między zdarzeniami, które pierwotnie były współbieżne.
Dlaczego ta prostota była tak wpływowa
Artykuł Lamporta pokazał, że można projektować algorytmy rozproszone bez próby budowania perfekcyjnie zsynchronizowanego globalnego zegara. To zmieniło język całej dziedziny: zamiast pytać wyłącznie o czas fizyczny, można formalnie operować na częściowym porządku zdarzeń. Idea jest zaskakująco mała, ale daje fundament do wersjonowania, mutual exclusion, logów i późniejszych struktur przechowujących bogatszą informację o przyczynowości.
Zegary Lamporta są też dobrą lekcją o minimalizmie reprezentacji. Jeden licznik jest tani do przechowywania i przesyłania, ale celowo nie przechowuje pełnej historii zależności. Gdy aplikacja potrzebuje rozpoznać prawdziwą współbieżność, potrzebny jest bogatszy mechanizm, np. vector clock. To pokazuje typowy kompromis systemowy: im więcej własności chcemy później wywnioskować z metadanych, tym więcej informacji trzeba zachować przy każdej operacji. Nie istnieje darmowa, kompletna wiedza o rozproszonym wykonaniu.
W praktyce logiczne liczniki są też odporne na wiele problemów zegara ściennego: nie cofają się dlatego, że administrator poprawił godzinę albo system zsynchronizował NTP. Oczywiście po restarcie i przy trwałym przechowywaniu trzeba zachować odpowiednią ciągłość lub epokę, jeśli liczby mają mieć znaczenie długoterminowe. Sednem jest jednak rozdzielenie dwóch pojęć, które interfejs zegarka zwykle miesza: mierzenia czasu i ustalania kolejności.