6

XMLベースのペイロードを使用してiPhoneとWebサイトの間で2つのビジネスオブジェクトを同期する作業をしており、最適なルーチンのアイディアを募集したいと考えています。2つの異種システム間でオブジェクトを同期するのが最善の方法ですか?

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

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

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

答えて

11

最も簡単な方法:同期するときは、すべてのレコードを転送してくださいwhere updated_at >= @last_sync_at。下側:このアプローチでは、クロックスキューをまったく許容できません。

行が更新されるたびに増分される(クロックスキューが同期プロセスを妨げないように)バージョン番号の列を保持する方が安全でしょう。特定される)。この帯域幅を効率的にするには、変更された行だけを送信する必要があるように、各レプリケーションピアに送信された最新バージョンの各データベースにキャッシュを保持します。これがスタートポロジになる場合、リーフは、最後に同期されたバージョンが各テーブルに格納されている単純化されたスキーマを使用できます。

削除の同期をサポートするためには、ソフト削除のいくつかの形式が必要ですが、削除された行のキーのみを含む「削除」レコードの形式にすることができます。墓石は、すべての複製がそれらを処理したことを確かめたら、安全に削除することができます。そうしないと、不規則な複製が削除されたと考えられるレコードを復活させる可能性があります。

+0

フィードバックいただきありがとうございます。私はあなたがタイムスキューに関して育んだ問題は重要だと思います。 私の最初の希望は、サーバー上のNTPと、iPhone/Touch独自の時刻同期サービスとキャリア/コンピュータ間のスキューの問題が緩和されることです。この仮定はあまりにも危険ですか? – hyuan

+0

これは、多くの点で脆弱です。たとえば、時計が逆方向にリセットされると、更新が失われる可能性があります。更新が見つからないと、編集の競合が検出されなくなります。マルチマスターレプリケーションは重要な作業ではありません。 –

+0

親切なアドバイスをありがとうございます。うまくいけば、数週間後に、あなたはあなたの知恵の実を見ることができます。問題のサイトはすでにアップしていますが(www.ayenotes.com)、iPhoneアプリはありません。 – hyuan

0

私は要約すると、切断された同期に関連すると思います。だからここ

は、私は起こるべきだと思うものです:あなたは、データとそれに関連するすべての情報(行バージョン、ファイルのチェックサムなど)を取得

最初の同期。この情報を保存し、次回の正常な同期までは元のままにしておくことが重要です。変更はこのデータのCOPYで行う必要があります。

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

競合を確認するデータベースの行だけを処理している場合でも、競合を検出するのは簡単です。行が更新されるたびに増分する別の列を持つことができます(mssqlにはmysqlについては不明な組み込み関数があります)。したがって、コピーしたコピーの数がサーバー上のものと異なる場合、競合が発生します。ファイルまたは文字列の場合、チェックサムがそのジョブを実行します。あなたは修正日を使用することもできますが、ミスを防ぐために非常に正確で正確な測定値を持っていることを確認してください。たとえば、ファイルを取得し、取得したファイルをすぐに保存するとします。時差は1ミリ秒と言います。その後、ファイルを変更して保存しようとします。記録された最終変更時刻が10ミリ秒にしか正確でない場合、取得したファイルに保存したものと同じ修正日が付いている可能性が高いので、プログラムは競合しないと判断して変更を上書きします。だから、私は一般的にこの方法を安全​​な側に使うのではない。一方、マイナーな変更後のチェックサム/ハッシュ衝突の可能性はほとんどありません。

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

あなたが正しいことをしていれば、もしあれば、ユーザーには衝突のリストが与えられるべきです。これらの競合は、ユーザが迅速に決定するのに十分細かくなければならない。たとえば、競合はからの綴りの変更です。ユーザーが単語のスペルを選択するのは、ユーザーに段落全体を与え、変更があったことを伝え、何をすべきかを決定する必要があるユーザはこの小さなスペルミスを捜す必要があります。

その他の考慮事項:データ検証 - データが変更された可能性があるため、競合を解決した後に検証を実行する必要があることに注意してください。テキスト比較 - これは大きな問題です。だからgoogleそれ! Disconnected Synchronization - 私はそこにいくつかの記事があると思います。

出典:https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers

関連する問題