6

XML ベースのペイロードを使用して、iPhone と Web サイト間で 2 つのビジネス オブジェクトを同期する作業を行っており、最適なルーチンのアイデアを募集しています。

ただし、この質問の性質はかなり一般的であり、Web エンティティとクライアント (デスクトップ、携帯電話など) の間でビジネス オブジェクトを同期する必要があるさまざまなシステムに適用できることがわかります。

ビジネス オブジェクトは、両側で編集、削除、および更新できます。どちらの側でもオブジェクトをローカルに保存できますが、同期は切断された表示のために iPhone 側でのみ開始されます。すべてのオブジェクトには updated_at と created_at のタイムスタンプがあり、両側で RDBMS に支えられています (iPhone 側の SQLite と Web の MySQL ... 繰り返しますが、これはあまり重要ではないと思います)。同期が試みられました。それ以外の場合、(現時点では) 他のデータは保存されません。

同期のためにシステム間のネットワーク チャットを最小限に抑えるには、どのアルゴリズムを使用しますか? 「ソフト削除」がオプションでない場合、削除をどのように処理しますか? これを容易にするために、どのようなデータ モデルの変更を追加しますか?

4

2 に答える 2

11

最も簡単な方法: 同期時に、すべてのレコードを転送しますwhere updated_at >= @last_sync_at。欠点: このアプローチでは、クロック スキューがまったく許容されません。

行が更新されるたびにインクリメントされるバージョン番号列 (クロック スキューが同期プロセスを妨害しないようにするため) と、最後に同期されたバージョン番号 (競合する可能性のある変更を識別できるようにするため) を保持する方がおそらく安全です。この帯域幅効率を高めるには、各レプリケーション ピアに送信された最後のバージョンの各データベースにキャッシュを保持して、変更された行のみを送信する必要があるようにします。これがスター トポロジになる場合、リーフは、最後に同期されたバージョンが各テーブルに格納される単純化されたスキーマを使用できます。

削除の同期をサポートするには、何らかの形式のソフト削除が必要ですが、これは、削除された行のキーのみを含む "tombstone" レコードの形式にすることができます。Tombstone を安全に削除できるのは、すべてのレプリカがそれらを処理したことを確認した場合のみです。そうしないと、削除されたと思われるレコードが、取り残されているレプリカによって復活する可能性があります。

于 2009-03-11T23:01:13.383 に答える
0

要約すると、あなたの質問は切断された同期に関連していると思います。

だからここに私が起こるべきだと思うことがあります:

初期同期 データとそれに関連するすべての情報 (行バージョン、ファイル チェックサムなど) を取得します。この情報を保存し、次の正常な同期まで元のままにしておくことが重要です。変更は、このデータの COPY に対して行う必要があります。

変更の追跡 データベースの行を扱っている場合、基本的に挿入、更新、および削除操作を追跡する必要があります。xml などのテキスト ファイルを扱う場合は、少し複雑になります。複数のユーザーがこのファイルを同時に編集する可能性が高い場合は、diff ツールが必要になるため、(ファイル全体ではなく) より詳細なレベルで競合を検出できます。

競合のチェック ここでも、データベースの行だけを扱っている場合、競合は簡単に検出できます。行が更新されるたびにインクリメントする別の列を作成できます (mssql には、このビルトインが mysql についてわからないと思います)。したがって、持っているコピーの番号がサーバー上の番号と異なる場合は、競合が発生しています。ファイルまたは文字列の場合、チェックサムが機能します。変更日も使用できると思いますが、ミスを防ぐために非常に正確で正確な測定値があることを確認してください. たとえば、ファイルを取得して、取得したらすぐに保存するとします。時間差が 1 ミリ秒だとしましょう。次に、ファイルに変更を加えてから、保存しようとします。記録された最終変更時刻が 10 ミリ秒までしか正確でない場合、私が取得したファイルは、保存したファイルと同じ更新日を持つ可能性が高いため、プログラムは競合がないと判断し、変更を上書きします。したがって、私は通常、安全のためにこの方法を使用しません。一方、マイナーな変更後にチェックサム/ハッシュの衝突が発生する可能性はほとんどありません。

競合の解決 ここが難しい部分です。これが自動化されたプロセスである場合は、状況を評価して、変更を上書きするか、変更を失うか、サーバーからデータを再度取得して変更をやり直すかを決定する必要があります。幸いなことに、人間の相互作用があるようです。しかし、コーディングするのはまだ大変です。データベースの行を扱っている場合は、個々の列を確認し、それをサーバーのデータと比較して、ユーザーに提示できます。アイデアは、競合を圧倒しないように、非常に細かい方法で競合をユーザーに提示することです。ほとんどの競合は、多くの異なる場所で非常に小さな違いがあるため、一度に 1 つの小さな違いをユーザーに提示します。したがって、テキスト ファイルの場合は、ほぼ同じですが、100 倍以上複雑です。したがって、基本的には diff ツールを作成または使用する必要があります (テキスト比較はまったく別のテーマであり、広範すぎてここで言及することはできません)。データベース: テキストが挿入、削除、または編集された場所。次に、それを同じ方法でユーザーに提示します。したがって、基本的に小さな競合ごとに、ユーザーは変更を破棄するか、サーバーの変更を上書きするか、サーバーに送信する前に手動で編集するかを選択する必要があります。

したがって、正しいことを行った場合、競合がある場合は、ユーザーに競合のリストが表示されます。これらの競合は、ユーザーが迅速に決定できるように十分に細かくする必要があります。したがって、たとえば、競合はスペルの変更です。ユーザーに段落全体を提供し、変更があり、何をすべきかを決定する必要があることをユーザーに伝えるのとは対照的に、単語のスペルから選択する方がユーザーにとって簡単です。の場合、ユーザーはこの小さなスペルミスを探す必要があります。

その他の考慮事項: データの検証 - データが変更されている可能性があるため、競合を解決した後に検証を実行する必要があることに注意してください。だからグーグル!切断された同期 - 記事がいくつかあると思います。

ソース: https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers

于 2012-03-31T04:36:13.953 に答える