2011-11-20 59 views
7

我正在開發一款應用程序,它將通過我控制的服務器在用戶之間同步數據。目前,我正在記錄每個設備上的UTC更改時間,然後幫助確定哪些數據是最新的 - 服務器上或設備上的數據。我可以依靠iOS設備時鐘正確嗎?

我可以依靠iPhone和iPad UTC時間是準確的?如果沒有,我還可以如何標記更新,這些更新仍然可以讓我檢測來自各種用戶的更新並檢測可能的更新衝突?

+1

我會推薦在應用程序啓動時以及關閉並重新啓動時使用NSTimeInterval。比較它,如果它符合你指定的時間限制,從服務器上下載數據 – CodaFi

+1

這實際上是我的設計原則 - 從不依賴分佈式系統中算法的時間。只使用時間作爲數據。 – bryanmac

回答

6

絕對不能依賴iOS設備時鐘正確。用戶可以將它們設置爲他們喜歡的任何內容,而不必與時間服務器同步。

在做同步,你可以通過獲取的當前時間的設備的視圖開始這一進程。如果這與當前時間的服務器視圖不同,則可以將此偏移量應用於正在上載的更改的時間戳,以將它們置於「服務器時間」。很顯然,這假定器件時鐘在更改期間沒有改變 - 也就是說,它忽略了一些更改具有正確時間的可能性,有些更改要求應用偏移。

最安全的辦法是跟蹤這個偏移量,看它是否會做出一個同步衝突的任何差異。在任何情況下,如果它有所作爲,請應用偏移量,但在任何情況下,它不會影響最新數據,請使用設備上的未修改時間戳 - 因此,如果用戶回想它是「3: 00pm「時,他們仍然會在下午3:00看到該活動時間戳。如果使用任何偏移量計算,不要忘記確保沒有任何項目應該相對於服務器及時向前移動,直到它將來聲稱已經發生。 :)

3

不要依賴於時間是準確的對在分佈式系統的核心算法多臺機器。

(尤其是像偶爾連接的設備)最大的問題,就是他們可以斷開很長一段時間,使許多變化。我們不是在談論這裏的漂移,我們正在談論潛在的長時間的許多編輯可能沒有連接到沒有可靠的時間在設備上的服務器。

如果您希望在系統中使用近似交錯操作(facebook應用程序,而不是財務),服務器可以隨着每次更改而保持不斷增加的變化 - 應用更改的日記類型。然後當設備更改一個實體時,它會記錄它並引用它所知道的最後一個changeId。將該實體修訂版寫回服務器將導致一個新的changeId被記錄,但實體修訂版在設備寫入changeId(確定在實體寫入歷史記錄中交織的位置)和新服務器changeId(當其他客戶從changeId x獲得所有修訂時使用)。然後

設備可以檢索的所有更改自上次changedId它知道,並會得到所有的實體 - 基於它知道這是寫入時對changeId觀察實體時,它可以訂購的版本。

這意味着連接更一致的裝置這就是將贏得更多的寫入(交錯),並且更偶爾連接會更頻繁地輸設備。但是,所有的修改都將被編寫 - 只是最新的勝利。你可以在現場或實體層面做到這一點。如果在字段級別,不同用戶的字段更改會毫不費力地合併 - 如果這是您想要的。

這是一個近似的分佈式修訂版交錯,它只是基於您的最後一條消息與服務器交錯。

相關問題