16

ユーザーがオンラインに戻ったときにサーバーと同期されるデータをユーザーが作成できるオフライン モードをサポートするインターネット アプリケーションがあります。このため、データベースのアイデンティティに UUID を使用しているため、切断されたクライアントは、別のクライアントが使用する ID を使用することを恐れずに新しいオブジェクトを生成できます。ただし、これは、このユーザーが所有するオブジェクトに対してはうまく機能します。複数のユーザーによって共有されるオブジェクトです。たとえば、ユーザーが使用するタグはグローバルである可能性があり、リモート データベースがユニバース内の可能なすべてのタグを保持できる方法はありません。

オフライン ユーザーがオブジェクトを作成し、いくつかのタグを追加した場合。これらのタグがユーザーのローカル データベースに存在しないため、ソフトウェアがタグの UUID を生成するとします。これらのタグが同期されると、重複を解決するための解決プロセスが必要になります。リモート データベース内の既存のタグをローカル バージョンと照合する何らかの方法。

1 つの方法は、グローバル オブジェクトが自然キー (タグの場合は名前) によって解決されるプロセスを使用することです。ローカル データベースは、既存のオブジェクトをグローバル データベースのオブジェクトに置き換える必要があります。他のオブジェクトへの接続が多数ある場合、これは面倒な場合があります。これを避けるように何かが私に言います。

これを処理する別の方法は、2 つの ID を使用することです。1 つのグローバル ID と 1 つのローカル ID。UUID を使用することでこれを回避できると期待していましたが、単一の UUID を使用する場合と 2 つの分割 ID を使用する場合を行き来しています。このオプションを使用すると、問題を手に負えなくなったのではないかと思います。

もう 1 つの方法は、非共有オブジェクトを通じてすべての変更を追跡することです。この例では、ユーザーがタグを割り当てたオブジェクトです。ユーザーがオフラインでの変更を同期すると、サーバーはユーザーのローカル タグをグローバル タグに置き換える場合があります。次にこのクライアントがサーバーと同期するときに、非共有オブジェクトの変更が検出されます。クライアントがそのオブジェクトをプルダウンすると、グローバル タグを受け取ります。ソフトウェアは、非共有オブジェクトをサーバーのタグに向けて再保存し、ローカル バージョンを孤立させます。これに関するいくつかの問題は、完全に同期するための余分なラウンド トリップと、孤立したばかりのローカル データベース内の余分なデータです。システムが同期状態の間にあるときに発生する可能性のある他の問題やバグはありますか? (つまり、サーバーと通信して、オブジェクトのローカル UUID を送信しようとするなど)。

もう 1 つの方法は、一般的なオブジェクトを避けることです。私のソフトウェアでは、それは受け入れられる答えになる可能性があります。私はユーザー間でオブジェクトを共有することはあまりしていませんが、それは将来もそうしないという意味ではありません。つまり、このオプションを選択すると、将来、これらのタイプの機能を追加する必要が生じた場合、ソフトウェアが麻痺する可能性があります. この選択には結果が伴いますが、それらを完全に調査したかどうかはわかりません。

だから私は、あらゆる種類のベストプラクティス、このタイプのシステムを処理するための既存のアルゴリズム、選択に関するガイダンスなどを探しています.

4

3 に答える 3

4

あなたの問題は、SVN のようなバージョン管理システムとよく似ています。それらから例を挙げることができます。

各ユーザーは、一連の個人用オブジェクトと必要な共有オブジェクトを持ちます。ローカルでは、すべてのオブジェクトを所有しているかのように機能します。

同期中、クライアントは最初にオブジェクトの変更をダウンロードし、明らかなものを自動的に同期します。あなたの例では、サーバーから同じ名前の新しいタグがある場合、それに応じてローカルシステムでUUIDが更新されます。

これは、別のクライアントから同じユーザーによってコミットされたデータのようなケースを検出して処理するのにも適しています。

クライアントがデータの更新およびマージされたバージョンを取得したら、アップロードを実行できます。

往復する必要がありますが、データ構造を過度に複雑にし、同期を行う方法に潜在的な落とし穴がない限り、これを行う方法はないと思います。

于 2009-08-12T12:47:47.903 に答える
3

完全に左翼の提案として、 CouchDBのようなものを使用することがあなたの状況でうまくいくかどうか疑問に思っています。そのレプリケーション機能は、競合が発生したときにアプリケーションが解決を処理できるようにするメカニズムなど、オンライン/オフラインの同期に関する多くの問題を処理できます。

于 2009-08-12T14:18:48.970 に答える