Подробнее о работе Truetime и Spanner см. В разделе 3 Spanner Whitpaper (1) .
Обсуждение того, как это можно реализовать, находится в вопросе "Почему API Google TrueTime трудно дублировать?"(2)
В официальном документе Spanner значение TrueTime представляет собой не одно значение, а отметку времени диапазон , которая гарантированно содержит абсолютное значение.Этот диапазон учитывает потенциальный дрейф часов - который в сети Google с синхронизацией часов сервера с атомным / GPS эталонным временем каждые 30 сек составляет до 7 мс (из документа).
Так что если TTstamp1
это диапазон (t1_lo, t1_hi)
и TTstamp2
это диапазон (t2_lo, t2_hi)
, тогда before()
и after()
просто сравнивают крайние значения этих диапазонов, чтобы убедиться, что они не перекрываются.
TTstamp1.before(TTValue2) = t1_hi < t2_lo
TTstamp1.after(TTValue2) = t1_lo > t2_hi
Ответ на ваши вопросы, таким образом:
Нет, TT.now()
не возвращает одинаковый результат на всех серверах, даже если он вызывается с точно такой жемгновенный.Однако значения, полученные на всех серверах при вызове в этот момент, будут перекрывать друг друга, а это означает, что ни один из них не является ни до, ни после друг друга.
Таким образом, для данного TrueTime t
технически возможно , что на сервере A t.before(now)
равно true
и на сервере B t.before(now)
false
из-за сравнения перекрытий и различий между возможными диапазонами.Это не проблема для Spanner, поскольку он будет ждать , пока не будет перекрытия (t.before(now)==true
), прежде чем совершать транзакцию и сохранять ее временную метку.
(Примечание: эта информация взята из публичных технических документов и документации)