2013-10-22 130 views
0

我有一個服務器 - 客戶端應用程序,其中應用程序的一般用途是讓一個客戶端同時連接到多個服務器。客戶端請求每臺服務器開始在服務器本地開始記錄數據,從DateTime某些TimeSpan開始。提出請求後,客戶端與服務器斷開連接。然後,一段時間後,客戶端重新連接到服務器以檢索記錄的數據。爲了讓客戶正確解析記錄的數據,所有服務器之間的時間參考必須匹配(在某種合理的準確度內,比如說1秒)。跨多臺計算機的DateTime同步

所以我需要能夠實現在記錄期間該客戶端引用的所有服務器的同步時間。

我不能保證服務器在線(它們可能只在本地局域網上),因此我不能讓它們在UTC時間輪詢一些互聯網數據庫。我無法保證客戶在整個錄音過程中都保持連接,因此我不能讓客戶不斷地發送時間作爲參考。

我想這隻剩下一個選項:客戶端必須告訴每個服務器它認爲時間是什麼時候設置記錄,服務器必須找出當時和他們認爲時間之間的差異。然後服務器必須將該增量應用於任何記錄的數據。

我擔心這種方法。它會在很長一段時間內保持準確的時間,比如10天嗎?如果其中一臺服務器無法保持良好時間,三角洲能否隨時間漂移?

或者,有沒有更好的方法來做到這一點?

+0

我建議你重新考慮一下你的vasic假設:你想要電腦,可能無法正確保持時間,做出基於時間的desicions。還是我得到這個錯誤? –

+0

我完全同意。不幸的是,我無法控制安裝我的軟件的硬件。硬件有可能是壞的CMOS或者無法保持時間。在沒有互聯網連接的情況下保持準確的時間實際上並非微不足道。漂移的百分比可能會驚人地高。 –

+0

這就是我的意思:如果你不能保證計時,你不能保證準確的時間desicions。 –

回答

1

如果我正確理解你的任務,你需要從請求開始測量相對時間數據的結尾收集,即你必須知道何時收集到完全確定的數據。爲了解決這個任務,你的服務器只需要跟蹤他們活動的相對時間(在Windows上,這可以使用GetTickCount函數來完成,在unix上存在類似的功能),並記錄數據收集開始以來的相對時間。在客戶端上,您可以添加客戶端發送數據收集請求的絕對時間(也可以將這次存儲在客戶端上)。

1

我不能讓他們爲UTC時間輪詢一些互聯網數據庫......但是,即使只是有時間訪問互聯網UTC(例如NTP服務器),也可以估計本地與互聯網UTC相比,時間進步更快。這可以基本上用於在一段時間內預測offset。典型的現代硬件顯示每秒5到20微秒的漂移速率。一些實施工作可以使漂移率達到大約1微秒/秒的精確度。因此,1 us/s的剩餘「不準確性」將產生3.6 ms /小時或〜90 ms /天的誤差。

你的要求準確性的一些合理的程度內,說了很長一段時間1秒,說10天可以用這樣的方案,1我們的偏差滿足/ s的積累到大約900毫秒/ 10天。

如何做到這一點:(一個非常基本的描述)

  • 收集互聯網UTC(NTP服務器)時,有機會獲得網絡連接。
  • 建立本地UTC和互聯網UTC對。
  • 預測漂移率(使用數學來提高其準確度,例如平均值,異常值拒絕等)
  • 將漂移率校正應用於您的數據包。

這也可以在客戶端完成。客戶端不僅接收記錄的數據,還接收服務器的時間戳。通過這種方式,客戶端可以估計自上次請求處理以來在服務器端花費的時間。它將服務器端的流逝時間與客戶端流逝的時間進行比較,估計漂移率,並對記錄的數據進行校正。這基本上沒有任何互聯網UTC的工作。

1

您主要關注內部一致性,而不是絕對的時間,所以:

  1. 設置NTP服務器的局域網。
  2. 讓所有基於局域網的機器從此同步。
  3. (可選:得到這個NTP服務器從INET進行同步時,它連接。)