2011-11-20 10 views
7

私は制御しているサーバーを通じてユーザー間でデータを同期するアプリケーションに取り組んでいます。現在、各デバイスの変更のUTC時間を記録しています。これにより、サーバーまたはデバイス上の最新のデータを判断するのに役立ちます。iOSデバイスの時計が正しいかどうかを確認できますか?

iPhoneとiPadのUTCの時間は正確でしょうか?もしそうでなければ、私は様々なユーザーからの更新を検出し、可能な更新の衝突を検出することができる更新をどのようにスタンプできますか?

+1

アプリの起動時と終了時にNSTimeIntervalを使用することをお勧めします。それを比較し、指定された時間制限と一致する場合は、サーバーからデータをダウンロードしてください。 – CodaFi

+1

これは実際に私の設計主体のものです。分散システムのアルゴリズムの時間に決して依存しません。時間だけをデータとして使用する。 – bryanmac

答えて

6

もちろん、iOSデバイスの時計が正しいとは限りません。ユーザーは好きなように設定することができ、タイムサーバーと同期する必要はありません。

同期を実行するときは、デバイスの現在の時刻を取得することでプロセスを開始できます。これが現在の時刻のサーバーのビューと異なる場合は、このオフセットをアップロードされた変更のタイムスタンプに適用して、それらを「サーバー時刻」に持ち込むことができます。これは、変更が行われた期間中にデバイスクロックが変更されていないことを前提としています。つまり、一部の変更に正しい時刻がある可能性が無視され、オフセットの適用が必要なものがあります。

最も安全なオプションは、このオフセットを追跡して、同期の競合に違いがあるかどうかを確認することです。違いが生じる場合は、オフセットを適用しますが、最新のデータと見なされるものに影響を与えない場合は、デバイスの変更されていないタイムスタンプを使用してください。ユーザーが「3:彼らが何かをしたとき、彼らはまだそのイベントが午後3時にタイムスタンプされたのを見るでしょう。オフセット計算を使用する場合は、将来発生すると主張されているポイントまで、サーバーに対して時間的に前に移動されるアイテムがないことを確認することを忘れないでください。 :)あなたの目的のために

3

のような論理的なクロックを使用するのが最適です。

大きな問題(特に時々接続されているデバイスなど)は、長時間接続を切断して多くの変更を加えることができます。ここではドリフトについては言及していませんが、デバイスに信頼できる時間がなくても、サーバーに接続されていない長期間にわたる多くの編集について潜在的に話しています。

重要ではないシステム(Facebook以外のアプリケーション、財務的ではない)でインターリーブ操作を近似したい場合は、適用される変更のジャーナルのすべての変更に伴ってサーバがますます増加するchangeIdを長く維持することができます。次に、デバイスがエンティティを変更すると、エンティティはそれを記録し、それが知っている最後のchangeIdを参照します。そのエンティティリビジョンをサーバに書き戻すと、新しいchangeIdがログに記録されますが、エンティティリビジョンは、デバイスによって書き込まれたときのchangeId(エンティティの書き出しのどこでインターリーブされるかを決める)と新しいサーバchangeId changedId xから他のクライアントがすべてのリビジョンを取得したときに使用されます)。

デバイスは、最後に変更された変更後の​​すべての変更を取得し、すべてのエンティティを取得します。エンティティが書き込まれたときに知っていたchangeIdに基づいてエンティティを表示すると、

これは、より一貫して接続されているデバイスが書き込み(インターリーブ)でより多く獲得し、時折接続されるデバイスが多く失われることを意味します。しかし、すべてのリビジョンが書かれます - ただ最新の勝利。フィールドレベルまたはエンティティレベルでこれを実行できます。フィールドレベルでフィールドごとに異なるユーザーがフィールドを変更すると、簡単にマージできます。

これは、サーバーとの最後のメッセージに基づいて単純にインターリーブする分散リビジョンのおおよそのインターリーブです。

関連する問題