
Временная метка Лампорта
Метка Лампорта — это счётчик, который помогает узлам в распределённой системе
договориться, в каком порядке произошли события, даже если у них разные часы.
Зачем вообще нужны метки Лампорта
В распределённых системах нет единого глобального времени.
У каждого узла (сервера) свои часы, которые могут идти чуть быстрее или медленнее.
Из-за этого невозможно точно сказать, что произошло “раньше”, если события происходят на разных узлах.
Пример:
- Сервер A считает, что сейчас 10:00:01.
- Сервер B считает, что сейчас 09:59:59.
Если они обменялись сообщениями — по обычным часам нельзя точно понять, кто первый.
Что придумал Лампорт
Лесли Лампорт предложил логические часы — простую систему счёта,
которая позволяет определить порядок событий, даже без реальных часов.
Каждое событие получает временную метку (timestamp),
которая увеличивается по определённым правилам.
Каждый процесс (или узел) хранит свой счётчик времени L:
- При каждом локальном событии → L = L + 1
- Когда узел отправляет сообщение, он передаёт свой L вместе с ним
- Когда узел получает сообщение с меткой L_remote →
он делает L = max(L, L_remote) + 1
Пример:
У нас есть два узла: A и B
Событие: A1:
Действие: A делает что-то (увеличивает счётчик)
Время: A:1
Событие: A2 → B:
Действие: A отправляет сообщение с меткой 1
Время: A:1 → B
Событие: B получает сообщение
Действие: B сравнивает: max(0, 1)+1 = 2
Время: B:2
Событие: B отвечает обратно
Действие: B:3
Событие: A получает ответ
Действие: max(1, 3)+1 = 4
Время: A:4
Теперь можно сказать:
- Событие A1 → произошло до B:2
- B:3 → произошло до A:4
А значит, порядок событий согласован между узлами.
Мы не знаем “реальное” время, но знаем какое событие было логически раньше.
Что это даёт
- Позволяет установить “happens-before” отношение (→):
если L(a) < L(b) и a → b, то a произошло раньше b. - Решает проблему упорядочивания событий без синхронизации часов.
- Используется в распределённых БД, логах, системах очередей, CRDT и т.д.