1. 程式人生 > >如何巧妙地測量伺服器之間的時間差

如何巧妙地測量伺服器之間的時間差

伺服器

緣起:無絕對時鐘
Fischer Lynch Paterson定理是分散式理論中非常重要的一個定理,其結論相當悲觀:在一個多程序非同步系統中,由於沒有全域性絕對時鐘,一定不存在一個一致的訊息投遞協議。

工程折衷:單點序列化
每個程序,每臺伺服器都有自己的本地時鐘,跨伺服器的本地時鐘比較是沒有意義的,這一點很好理解,伺服器A上的本地時間ta=1,伺服器B上的本地時間tb=2,雖然ta<tb,但我們並不能說ta一定早發生,因為兩臺伺服器的本地時間會有差異。
工程上,可以使用一臺單點伺服器來分發序列號,或者使用這臺單點伺服器來進行序列化,來模擬全域性時鐘。

問題的提出:既然兩臺伺服器的本地時間存在差值,如何來測量兩臺伺服器之間的時間差呢?


答案是,發包測量。

伺服器之間的時間差

發包流程如上圖:
1)伺服器A記錄一個本地時間Ta1,然後向伺服器B傳送一個報文
2)伺服器B接收到報文後取本地時間Tb放入到報文中,並將報文發回給伺服器A
3)伺服器A收到回覆報文後,記錄本地時間Ta2

很容易知道,Ta1和Ta2取的是伺服器A的本地時間,Tb取的是伺服器B的本地時間。
假設報文往返耗時是相同的(這個假設很合理),那麼
x = (Ta2 – Ta1)/2

如果,你硬要說這個x通過一次測量不準確的話,可以發1億次往返請求,來求出一個相對精確的x值
假設伺服器A與伺服器B的絕對時間是相同的(這個假設不合理),那麼
Tb = Ta1 + x = (Ta2 + Ta1)/2

可實際上,伺服器A與伺服器B存在一個時間差,不妨設時間差是“德爾塔”,那麼Tb + “德爾塔” = Ta1 + x= (Ta2 + Ta1)/2

於是,“德爾塔” = (Ta2 + Ta1)/2– Tb
這個“德爾塔”就是伺服器A與伺服器B的時間差

文章素材來自:http://www.habadog.com/2015/10/22/time-diff/