2008-12-23 128 views
13

我正在研究將一個簡單的同步功能寫入我的應用程序,並且彈出的一個問題是兩臺遠程計算機之間的時間同步,每臺計算機都有自己的時鐘(在特別是關於文件/對象的修改日期)。兩臺遠程計算機之間的同步(時鐘)

我敢肯定有很多的研究提供了關於這個話題已經完成,不想太理論化,但如果有任何公認的最佳實踐,最大限度地減少遠程時鐘之間的時間差異我想知道?

例如,一開始是始終使用通用時間(UTC)爲避免時區的問題,但不能保證兩臺計算機將具有完全相同的系統時間。幸運的是,我所做的工作並不是非常細緻,所以這不是一個非常重要的問題,但我仍然很好奇。

一個解決方案是始終在兩端使用相同的時鐘,例如全局時間服務器,而不是本地系統時鐘。據推測(與共享資源鎖相結合)可以保證同步時間不會意外重疊,但這不是很實際。只是突然出現在我的腦海

想到會是每個節點(每個客戶端)與之前,或許通過計算系統時鐘與全球時間服務器的偏移量的偏移量在某個時刻計算同步。這隻需要偶爾進行,因爲抵消本身不可能在短時間內發生很大變化。

更新:我只是補充一點,我並不感興趣實際上同步兩臺計算機的系統時鐘 - 我認爲操作系統將在大多數情況下處理這種情況。這只是一個如何確保應用程序的兩個實例使用同步時間的問題,不過在現在這個時代,我認爲系統時鐘幾乎可以確實同步到一些非常小的三角洲內。

回答

18

像其他人所推薦的那樣,依靠NTP爲您的應用程序提供便捷的功能。正確的方法是使用Lamport的分佈式時鐘同步算法。這是在他的經典1978年論文Time, clocks, and the ordering of events in a distributed system解釋。

+1

我擡頭看了Lamport的論文,似乎在討論時鐘同步時被廣泛引用。不幸的是,[看起來](http://www.amazon.com/Distributed-Systems-Principles-Paradigms-2nd/dp/0132392275)這個算法不適合實時應用程序(就像這裏所討論的那樣)(http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represents-a- time-in-the-future-in-absolute-terms-obj))..關於非NTP依賴性的實時時鐘同步算法的任何提示? – abbood 2012-10-08 14:19:37

3

將它們與NTP網絡時間協議同步。

你在哪個平臺上?

使用NTP,您可以將計算機的時間與原子鐘同步並使用世界的官方時間。

+0

.NET,但它是比什麼理論問題。 – devios1 2008-12-23 17:00:28

3

而不是編寫代碼來同步時鐘,是不是可以在兩臺機器上運行一個ntp客戶端?

或者,如果上述操作不可行並且您的應用程序運行時具有足夠的權限來設置時間,我會試圖在應用程序中實現最小的NTP客戶端,並嘗試將其與公共服務器進行同步。只是不要硬編碼某人的私人服務器...

+0

我並不熱衷於改變用戶的系統時鐘。 – devios1 2008-12-23 17:01:52

0

任何聯網的機器應該使用NTP。所有現代系統都包括一個簡單的方法來設置這個。唯一的問題應該是選擇一個特定的服務器,如果你需要一點額外的精度;但它已經在毫秒範圍內,所以我不在乎,通常只是指向pool.ntp.org內

2

一兩件事,我們基本上是卸載所有定時操作的「主機」的機器。例如,如果您有20個共享數據庫的服務器,請使用數據庫的時間。如果你有一臺中央服務器和一百萬臺客戶機,那麼客戶機不應該對任何計時負責;做所有的同步服務器端。在一個真正的「分佈式」環境中,如P2P網絡或類似的東西,可以使用最直接「擁有」相關資源的機器(即您想要寫入的實際PC)來同步/控制對文件的訪問。

+0

這些都是很好的建議,更多的是我正在尋找的答案。但是,假設兩臺計算機都沒有資源並且它是真正共享的。此外,兩臺計算機都無法直接訪問其他計算機,因此無法使用其時鐘。 – devios1 2008-12-23 17:27:44

3

這是一個問題,我現在必須解決一些不熟練的最終用戶,他們可以做很多事情來破壞以前貢獻者提出的合理建議。一個單純的最終用戶可以做至少這些事情,更多:

1)沒有足夠的計算知識,能夠建立NTP時間同步

2)自己的計算機時鐘設置爲房子時鐘或手機時鐘是不正確

3)在Windows XP中意外禁用NTP時間同步和不知道如何重新啓用它,或者在其計算機日期爲錯誤,在這種情況下的Windows NTP不工作

4)電腦bios電池已經平了,所以pc始終在1970年啓動!

5)用戶將筆記本電腦帶到國外並暫時將筆記本電腦時鐘設置爲當地時間,但不更改時區,因此現在電腦將返回錯誤的utc時間!

所以你的程序本身將不得不管理時間,當然你想用最小的開銷來做到這一點。

讓我們假設兩個運行您的程序的最終用戶需要程序在未來的相同絕對時間執行某些操作。

我提出這個方案,它從cron作業的方式中獲得一些想法,如果任何人都可以提出改進意見,我會很高興。 1)當你的應用程序啓動時,它通過肥皂呼叫到第三方服務器或你自己的時間服務器(你可以用ntp自己保持時間)來同步它自己的內部utc時間到ntp。

2)之後,它添加從系統時鐘流逝的時間以保持時間。如果要求很嚴格,您可能需要每隔一段時間重複一次ntp同步。

3)然後,應用程序查看它需要按時完成的未來作業列表。它需要知道最早的工作。

4)然後創建一個線程,讓它在最早的工作之前放置一段時間,而不是安全邊界,這取決於您的要求可能提前10分鐘,提前一到兩個小時等等。

5)當線程喚醒時,它會通過進一步的肥皂調用重新檢查絕對時間,然後依靠系統時間時鐘添加經過的時間,直到達到第一個工作應執行的時間出。

6)只要作業被觸發(在另一個線程中運行),時間監視線程就會計算下一個任務時間,並在此期間再次進入睡眠狀態。

增強的想法:

1)用戶可以在到期作業之前關閉您的應用程序,所以你可能需要一個後臺進程或服務,它使用上述同樣的同步方案,以獨立地監控你的工作列表,存儲在數據庫或文件中,並及時啓動應用程序。 (在Windows中,生成應用程序進程)

2)您的應用程序可能正在添加更新的,更早的作業或正在刪除作業,因此您的睡眠線程可能需要被喚醒才能重新計算新的早期作業,或在刪除作業之後的作業。在Win32中,你可以通過你的線程在一個事件上等待超時來做到這一點,你設置它強制它重新計算睡眠時間。在Linux中毫無疑問存在類似的機制。

3)對於SOAP調用,以獲得時間保持一個音符時發送的SOAP和接收到響應的時候。如果週轉時間過長,您不能依賴時間,可能需要重複呼叫,否則您可能會妥協。例如,如果肥皂表示計算機時鐘快5分鐘,但Soap調用本身需要一分鐘才能回覆,那麼您只能確定計算機時鐘至少快4分鐘。

0

請勿使用NTP。 NTP僅用於獲取日期/時間。

它的工作原理,以便同步不溝通的應用程序之間的事件。例如,一個鬧鐘應用程序和你的身體。

對於具有直接通信的應用程序,共享資源,使用蘭波特時鐘或矢量時鐘作爲季奧米季斯說。 Lamport時鐘非常適合實現事件之間的偏序,當需要識別併發事件時,向量時鐘非常好。

相關問題