Распределённые системы
Часы: тест с множественным выбором
Шесть вопросов через весь юнит. Каждый — это реальное решение при проектировании или отладке распределённого хранилища, а не определение для зубрёжки: как упорядочить события, когда настенные часы врут.
Убедись, что связываешь clock skew, выбор между физическими и логическими часами, семантику Lamport vs vector clock, happens-before и TrueTime — синтез, к которому вёл урок.
Кластер Cassandra использует last-write-wins по клиентским timestamp. Часы одного узла отстают на 1.5с. Поздний апдейт пользователя, прошедший через этот узел, исчезает после рефреша, при этом вернулся 200 OK. В чём корневая причина?
Нужно разрешение конфликтов в реплицированном KV-хранилище, которое никогда не должно молча терять конкурентный апдейт. Lamport clock или vector clock?
Lamport clock гарантирует: если A happens-before B, то L(A) < L(B). Почему нельзя из L(A) < L(B) заключить, что A вызвало B?
Твои vector clock корректны, но кластер из 200 узлов теперь возит 200 счётчиков метаданных с каждой записью, и это растёт с добавлением узлов. Какой реальный компромисс ты принял?
Что отдаёт TrueTime в Spanner и что делает с этим commit-wait?
Удаление в LWW-хранилище иногда подавляет каждую реальную запись по ключу на дни, даже записи, пришедшие задолго после удаления. В чём механизм?
Сквозная линия: настенное время не примитив упорядочивания, поэтому LWW превращает skew в тихую потерю данных (а tombstone с будущей датой — в многодневное подавление ключа). Логические часы упорядочивают по причинности: Lamport даёт дешёвый O(1) тотальный порядок, но не детектирует конкурентность, поэтому vector clock добавляют счётчик на узел, чтобы флагать конкурентные записи ценой O(n) метаданных, которые надо прунить. TrueTime идёт третьим путём: квантует неопределённость часов как ограниченный интервал ε и пережидает его commit-wait ради настоящей external consistency. Выбирай механизм по тому, что обязан знать — порядок, конкурентность или глобальную истину.