如何在Google Spanner实时中实现“之后”和“之前”方法?

时间:2019-07-04 10:17:49

标签: distributed-computing distributed google-cloud-spanner

根据他们的寻呼机,它说:“ TT.after()和TT.before()方法是TT.now()的便捷包装。”

根据What is the TrueTime API in Google's Spanner?

  

它还提供两个功能:

     
      如果确实经过t,
  1. after(t)返回true。例如。 t   如果t绝对还没有到达,或者<> now()。latest,
  2. before(t)返回true。
  3.   

我的问题是:

  1. 在扳手中的所有服务器上,TT.now()返回的结果是否相同?
  2. 在给定的时间t内,服务器A上的before(t)是true,而服务器B上的false是否可能?
  3. 它们是单调的吗?例如在服务器A上,TT.after(t)为真,某个时间以后,TT.after(t)是否为假?

2 个答案:

答案 0 :(得分:2)

有关Truetime和Spanner如何工作的详细信息,请参阅Spanner Whitpaper (1)的第3节。

问题"Why is Google's TrueTime API hard to duplicate?" (2)

中讨论了如何实施

根据《扳手白皮书》,TrueTime值不是单个值,而是时间戳 range ,该时间戳保证包含绝对值。此范围考虑了潜在的时钟漂移-在Google的网络中,每30秒将服务器时钟同步到atomic / GPS参考时间最多可达7ms(根据白皮书)。

因此,如果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

因此,您的问题的答案是:

  1. 否,即使在完全相同的时刻调用TT.now()也不会在所有服务器上返回相同的结果。但是,在那一刻被调用时,在所有服务器上获得的值将彼此重叠,这意味着它们之间没有一个在彼此之前或之后。

  2. 因此,对于给定的TrueTime t,从技术上来说,服务器A t.before(now)上的true和服务器B {{1由于重叠比较和可能范围之间的差异,}}为t.before(now)。对于Spanner来说,这不是问题,因为它将等待,直到提交事务并存储其时间戳之前没有重叠(false)。

(注意:此信息来自公共白皮书和文档)

答案 1 :(得分:0)

根据下面的图片,TT.after(t)TT.now().earliest > t,所以我认为TT.before(t)很可能是TT.now().latest < t

尝试回答我自己的问题:

  1. TT.now()不会同时在所有服务器上返回相同的结果。
  2. 是的,有可能。即使对于TT.after(),这也意味着时间t仅在某些服务器上确定地通过了。
  3. 我不知道。如果可能,则表示t已明确通过 ,然后不确定,听起来有点奇怪

我认为描述中的“绝对”有点误导,它们应该“高于最新版本”或“低于最早版本”

enter image description here