web-dev-qa-db-ja.com

デバイス間でモデル内の一貫したデータを維持するための最良の方法は?

かなり大きなアプリのモデルがあります。これらはすべて、ユーザーのデバイスに同時に配置する必要があります。たとえば、スプレッドシート。ユーザーが1つのデバイスでモデルに変更を加えた場合、集中サーバーを更新することで、この変更を他のすべてのユーザーに反映させたいと思います。

これを達成するための最良の方法はよくわかりません。私にはいくつかのアイデアがあります:

  1. モデルが変更されるたびに、サーバーに変更が通知され、データベースが更新されます。変更イベントは、接続されているすべてのデバイスにソケットを介して発行されます。次に、各デバイスは、サーバーからメッセージを受信すると、そのモデルを更新します。

このオプションに関する私の心配は、サーバーで問題が発生し、イベントが発行されない場合、一貫性が失われることです。

  1. モデルが変更されるたびに、サーバーに変更が通知され、データベースが更新されます。次に、すべてのデバイスにモデルを更新する必要があることを通知します。次に、デバイスはサーバーからモデル全体の新しいコピーをプルします。

ここでは、デバイスに大量のデータを繰り返しダウンロードすることに関連するパフォーマンスの問題がある可能性があります。

この問題に対処するためのアプローチは何でしょうか?

1
Tom

あなたが提案するのは、これを達成するための通常の方法です。代替手段は、ピアツーピアトポロジで他のデバイスと直接通信することですが、デバイスが追加されるとすぐに機能しなくなります。

したがって、要件はエラーをチェックして検出することです。サーバーにハートビートを実装して、サーバーが稼働していることを確認したり、デバイスが更新を送信するたびにインクリメントされるバージョン番号を追加したりすると、他のデバイスが更新が遅れているかどうか、または遅れているかどうかを判断できます。 1つまたは2つの更新(その後、ユーザーに再同期を強制する)

各デバイスがデルタ変更をサーバーに送信するのとほぼ同じ方法で、サーバーからデバイスに必要な変更のみを送信する必要があります。大きなドキュメントでは、伝播時間が法外に長くなる可能性があります-デバイスは、他の方法で送信される変更の速度に追いつくことができない場合があります(ダウンロードされたゲームの世界全体ではなく、プレーヤーの位置が変更パケットとして送信されるゲームを考えてください各フレーム)

1
gbjbaanb